{"version":3,"file":"cache.mjs","sources":["../../../../packages/cache/src/local-storage-cache.service.ts","../../../../packages/cache/src/cache.service.ts","../../../../packages/cache/src/token.ts","../../../../packages/cache/src/cache.interceptor.ts","../../../../packages/cache/cache.ts"],"sourcesContent":["import { Platform } from '@angular/cdk/platform';\nimport { inject, InjectionToken } from '@angular/core';\n\nimport { ICache, ICacheStore } from './interface';\n\nexport const DC_STORE_STORAGE_TOKEN = new InjectionToken<ICacheStore>('DC_STORE_STORAGE_TOKEN', {\n  providedIn: 'root',\n  factory: () => new LocalStorageCacheService()\n});\n\nexport class LocalStorageCacheService implements ICacheStore {\n  private readonly platform = inject(Platform);\n\n  get(key: string): ICache | null {\n    if (!this.platform.isBrowser) {\n      return null;\n    }\n    return JSON.parse(localStorage.getItem(key) || 'null') || null;\n  }\n\n  set(key: string, value: ICache): boolean {\n    if (!this.platform.isBrowser) {\n      return true;\n    }\n    localStorage.setItem(key, JSON.stringify(value));\n    return true;\n  }\n\n  remove(key: string): void {\n    if (!this.platform.isBrowser) {\n      return;\n    }\n    localStorage.removeItem(key);\n  }\n}\n","import { Platform } from '@angular/cdk/platform';\nimport { HttpClient } from '@angular/common/http';\nimport { Injectable, OnDestroy, inject } from '@angular/core';\nimport { BehaviorSubject, Observable, of, map, tap } from 'rxjs';\n\nimport { addSeconds } from 'date-fns';\n\nimport { AlainCacheConfig, AlainConfigService } from '@delon/util/config';\nimport { deepGet } from '@delon/util/other';\n\nimport { CacheNotifyResult, CacheNotifyType, ICache } from './interface';\nimport { DC_STORE_STORAGE_TOKEN } from './local-storage-cache.service';\n\n@Injectable({ providedIn: 'root' })\nexport class CacheService implements OnDestroy {\n  private readonly store = inject(DC_STORE_STORAGE_TOKEN);\n  private readonly http = inject(HttpClient);\n  private readonly platform = inject(Platform);\n\n  private readonly memory: Map<string, ICache> = new Map<string, ICache>();\n  private readonly notifyBuffer: Map<string, BehaviorSubject<CacheNotifyResult>> = new Map<\n    string,\n    BehaviorSubject<CacheNotifyResult>\n  >();\n  private meta: Set<string> = new Set<string>();\n  private freqTick = 3000;\n  private freqTime: any;\n  private cog: AlainCacheConfig = inject(AlainConfigService).merge('cache', {\n    mode: 'promise',\n    reName: '',\n    prefix: '',\n    meta_key: '__cache_meta'\n  })!;\n\n  constructor() {\n    if (!this.platform.isBrowser) return;\n    this.loadMeta();\n    this.startExpireNotify();\n  }\n\n  // #region meta\n\n  private pushMeta(key: string): void {\n    if (this.meta.has(key)) return;\n    this.meta.add(key);\n    this.saveMeta();\n  }\n\n  private removeMeta(key: string): void {\n    if (!this.meta.has(key)) return;\n    this.meta.delete(key);\n    this.saveMeta();\n  }\n\n  private loadMeta(): void {\n    const ret = this.store.get(this.cog.meta_key!);\n    if (ret && ret.v) {\n      (ret.v as string[]).forEach(key => this.meta.add(key));\n    }\n  }\n\n  private saveMeta(): void {\n    const metaData: string[] = [];\n    this.meta.forEach(key => metaData.push(key));\n    this.store.set(this.cog.meta_key!, { v: metaData, e: 0 });\n  }\n\n  getMeta(): Set<string> {\n    return this.meta;\n  }\n\n  // #endregion\n\n  // #region set\n\n  /**\n   * Persistent cached `Observable` object, for example:\n   * - `set('data/1', this.http.get('data/1')).subscribe()`\n   * - `set('data/1', this.http.get('data/1'), { expire: 10 }).subscribe()`\n   */\n  set<T>(\n    key: string,\n    data: Observable<T>,\n    options?: { type?: 's'; expire?: number; emitNotify?: boolean }\n  ): Observable<T>;\n  /**\n   * Persistent cached `Observable` object, for example:\n   * - `set('data/1', this.http.get('data/1')).subscribe()`\n   * - `set('data/1', this.http.get('data/1'), { expire: 10 }).subscribe()`\n   */\n  set(\n    key: string,\n    data: Observable<any>,\n    options?: { type?: 's'; expire?: number; emitNotify?: boolean }\n  ): Observable<any>;\n  /**\n   * Persistent cached simple object, for example:\n   * - `set('data/1', 1)`\n   * - `set('data/1', 1, { expire: 10 })`\n   */\n  set(key: string, data: unknown, options?: { type?: 's'; expire?: number; emitNotify?: boolean }): void;\n  /**\n   * Persistent cached simple object and specify storage type, for example caching in memory:\n   * - `set('data/1', 1, { type: 'm' })`\n   * - `set('data/1', 1, { type: 'm', expire: 10 })`\n   */\n  set(key: string, data: unknown, options: { type: 'm' | 's'; expire?: number; emitNotify?: boolean }): void;\n  /**\n   * 缓存对象\n   */\n  set(\n    key: string,\n    data: any | Observable<any>,\n    options: {\n      /** 存储类型，'m' 表示内存，'s' 表示持久 */\n      type?: 'm' | 's';\n      /**\n       * 过期时间，单位 `秒`\n       */\n      expire?: number;\n      /**\n       * 是否触发通知，默认：`true`\n       */\n      emitNotify?: boolean;\n    } = {}\n  ): any {\n    if (!this.platform.isBrowser) return;\n\n    let e = 0;\n    const { type, expire } = this.cog;\n    options = {\n      type,\n      expire,\n      ...options\n    };\n    if (options.expire) {\n      e = addSeconds(new Date(), options.expire).valueOf();\n    }\n    const emitNotify = options.emitNotify !== false;\n    if (!(data instanceof Observable)) {\n      this.save(options.type!, key, { v: data, e }, emitNotify);\n      return;\n    }\n    return data.pipe(\n      tap((v: any) => {\n        this.save(options.type!, key, { v, e }, emitNotify);\n      })\n    );\n  }\n\n  private save(type: 'm' | 's', key: string, value: ICache, emitNotify: boolean = true): void {\n    if (type === 'm') {\n      this.memory.set(key, value);\n    } else {\n      this.store.set(this.cog.prefix + key, value);\n      this.pushMeta(key);\n    }\n    if (emitNotify) {\n      this.runNotify(key, 'set');\n    }\n  }\n\n  // #endregion\n\n  // #region get\n\n  /** 获取缓存数据，若 `key` 不存在则 `key` 作为HTTP请求缓存后返回 */\n  get<T>(\n    key: string,\n    options?: {\n      mode: 'promise';\n      type?: 'm' | 's';\n      expire?: number;\n      emitNotify?: boolean;\n    }\n  ): Observable<T>;\n  /** 获取缓存数据，若 `key` 不存在则 `key` 作为HTTP请求缓存后返回 */\n  get(\n    key: string,\n    options?: {\n      mode: 'promise';\n      type?: 'm' | 's';\n      expire?: number;\n      emitNotify?: boolean;\n    }\n  ): Observable<any>;\n  /** 获取缓存数据，若 `key` 不存在或已过期则返回 null */\n  get(\n    key: string,\n    options: {\n      mode: 'none';\n      type?: 'm' | 's';\n      expire?: number;\n      emitNotify?: boolean;\n    }\n  ): any;\n  get(\n    key: string,\n    options: {\n      mode?: 'promise' | 'none';\n      type?: 'm' | 's';\n      expire?: number;\n      emitNotify?: boolean;\n    } = {}\n  ): Observable<any> | any {\n    if (!this.platform.isBrowser) return null;\n\n    const isPromise = options.mode !== 'none' && this.cog.mode === 'promise';\n    const value = this.memory.has(key) ? (this.memory.get(key) as ICache) : this.store.get(this.cog.prefix + key);\n    if (!value || (value.e && value.e > 0 && value.e < new Date().valueOf())) {\n      if (isPromise) {\n        return (this.cog.request ? this.cog.request(key) : this.http.get(key)).pipe(\n          map((ret: any) => deepGet(ret, this.cog.reName as string[], ret)),\n          tap(v =>\n            this.set(key, v, {\n              type: options.type as any,\n              expire: options.expire,\n              emitNotify: options.emitNotify\n            })\n          )\n        );\n      }\n      return null;\n    }\n\n    return isPromise ? of(value.v) : value.v;\n  }\n\n  /** 获取缓存数据，若 `key` 不存在或已过期则返回 null */\n  getNone<T>(key: string): T;\n  /** 获取缓存数据，若 `key` 不存在或已过期则返回 null */\n  getNone(key: string): any {\n    return this.get(key, { mode: 'none' });\n  }\n\n  /**\n   * 获取缓存，若不存在则设置持久化缓存 `Observable` 对象\n   */\n  tryGet<T>(\n    key: string,\n    data: Observable<T>,\n    options?: { type?: 's'; expire?: number; emitNotify?: boolean }\n  ): Observable<T>;\n  /**\n   * 获取缓存，若不存在则设置持久化缓存 `Observable` 对象\n   */\n  tryGet(\n    key: string,\n    data: Observable<any>,\n    options?: { type?: 's'; expire?: number; emitNotify?: boolean }\n  ): Observable<any>;\n  /**\n   * 获取缓存，若不存在则设置持久化缓存基础对象\n   */\n  tryGet(key: string, data: unknown, options?: { type?: 's'; expire?: number; emitNotify?: boolean }): any;\n  /**\n   * 获取缓存，若不存在则设置指定缓存类型进行缓存对象\n   */\n  tryGet(key: string, data: unknown, options: { type: 'm' | 's'; expire?: number; emitNotify?: boolean }): any;\n\n  /**\n   * 获取缓存，若不存在则设置缓存对象\n   */\n  tryGet(\n    key: string,\n    data: any | Observable<any>,\n    options: {\n      /** 存储类型，'m' 表示内存，'s' 表示持久 */\n      type?: 'm' | 's';\n      /**\n       * 过期时间，单位 `秒`\n       */\n      expire?: number;\n      /**\n       * 是否触发通知，默认：`true`\n       */\n      emitNotify?: boolean;\n    } = {}\n  ): any {\n    if (!this.platform.isBrowser) return null;\n\n    const ret = this.getNone(key);\n    if (ret === null) {\n      if (!(data instanceof Observable)) {\n        this.set(key, data, options as any);\n        return data;\n      }\n\n      return this.set(key, data as Observable<any>, options as any);\n    }\n    return of(ret);\n  }\n\n  // #endregion\n\n  // #region has\n\n  /** 是否缓存 `key` */\n  has(key: string): boolean {\n    return this.memory.has(key) || this.meta.has(key);\n  }\n\n  // #endregion\n\n  // #region remove\n\n  private _remove(key: string, needNotify: boolean): void {\n    if (needNotify) this.runNotify(key, 'remove');\n    if (this.memory.has(key)) {\n      this.memory.delete(key);\n      return;\n    }\n    this.store.remove(this.cog.prefix + key);\n    this.removeMeta(key);\n  }\n\n  /** 移除缓存 */\n  remove(key: string): void {\n    if (!this.platform.isBrowser) return;\n\n    this._remove(key, true);\n  }\n\n  /** 清空所有缓存 */\n  clear(): void {\n    if (!this.platform.isBrowser) return;\n\n    this.notifyBuffer.forEach((_v, k) => this.runNotify(k, 'remove'));\n    this.memory.clear();\n    this.meta.forEach(key => this.store.remove(this.cog.prefix + key));\n  }\n\n  // #endregion\n\n  // #region notify\n\n  /**\n   * 设置监听频率，单位：毫秒且最低 `20ms`，默认：`3000ms`\n   */\n  set freq(value: number) {\n    this.freqTick = Math.max(20, value);\n    this.abortExpireNotify();\n    this.startExpireNotify();\n  }\n\n  private startExpireNotify(): void {\n    this.checkExpireNotify();\n    this.runExpireNotify();\n  }\n\n  private runExpireNotify(): void {\n    this.freqTime = setTimeout(() => {\n      this.checkExpireNotify();\n      this.runExpireNotify();\n    }, this.freqTick);\n  }\n\n  private checkExpireNotify(): void {\n    const removed: string[] = [];\n    this.notifyBuffer.forEach((_v, key) => {\n      if (this.has(key) && this.getNone(key) === null) removed.push(key);\n    });\n    removed.forEach(key => {\n      this.runNotify(key, 'expire');\n      this._remove(key, false);\n    });\n  }\n\n  private abortExpireNotify(): void {\n    clearTimeout(this.freqTime);\n  }\n\n  private runNotify(key: string, type: CacheNotifyType): void {\n    if (!this.notifyBuffer.has(key)) return;\n    this.notifyBuffer.get(key)!.next({ type, value: this.getNone(key) });\n  }\n\n  /**\n   * `key` 监听，当 `key` 变更、过期、移除时通知，注意以下若干细节：\n   *\n   * - 调用后除再次调用 `cancelNotify` 否则永远不过期\n   * - 监听器每 `freq` (默认：3秒) 执行一次过期检查\n   */\n  notify(key: string): Observable<CacheNotifyResult> {\n    if (!this.notifyBuffer.has(key)) {\n      const change$ = new BehaviorSubject<CacheNotifyResult>(this.getNone(key));\n      this.notifyBuffer.set(key, change$);\n    }\n    return this.notifyBuffer.get(key)!.asObservable();\n  }\n\n  /**\n   * 取消 `key` 监听\n   */\n  cancelNotify(key: string): void {\n    if (!this.notifyBuffer.has(key)) return;\n    this.notifyBuffer.get(key)!.unsubscribe();\n    this.notifyBuffer.delete(key);\n  }\n\n  /** `key` 是否已经监听 */\n  hasNotify(key: string): boolean {\n    return this.notifyBuffer.has(key);\n  }\n\n  /** 清空所有 `key` 的监听 */\n  clearNotify(): void {\n    this.notifyBuffer.forEach(v => v.unsubscribe());\n    this.notifyBuffer.clear();\n  }\n\n  // #endregion\n\n  ngOnDestroy(): void {\n    this.memory.clear();\n    this.abortExpireNotify();\n    this.clearNotify();\n  }\n}\n","import { HttpContextToken } from '@angular/common/http';\n\nexport interface CacheOptions {\n  /**\n   * Whether to enable it, if `Cache-control: max-age=xxx` is found when the request returns, it will be automatically cached, and the next request will be forced to obtain data from the cache unless `enabled: false` is specified; default `true`\n   *\n   * 是否启用，当启用后若请求返回时发现 `Cache-control: max-age=xxx` 时自动缓存，下一次请求时除非指定 `enabled: false` 否则强制从缓存中获取数据；默认 `true`\n   */\n  enabled?: boolean;\n  /**\n   * Specify the cache unique key, which is used to distinguish cache entries, and the default is based on the requested URL\n   *\n   * 指定缓存唯一键，用于区分缓存条目，默认以请求的 URL 为准\n   */\n  key?: string;\n  /**\n   * Specify the storage method, `m` means memory, `s` means persistence; default: `m`\n   *\n   * 指定存储方式，`m` 表示内存，`s` 表示持久化；默认：`m`\n   */\n  saveType?: 'm' | 's';\n  /**\n   * Expire time, the highest priority when returning `Cache-control: max-age=xxx`, unit `second`\n   *\n   * 过期时间，当返回 `Cache-control: max-age=xxx` 时优先级最高，单位 `秒`\n   */\n  expire?: number;\n  /**\n   * Whether to trigger a notification, default: `true`\n   *\n   * 是否触发通知，默认：`true`\n   */\n  emitNotify?: boolean;\n}\n\n/**\n * Cache options (Don't forget to register `CacheInterceptor`)\n *\n * 缓存配置项（不要忘记注册 `CacheInterceptor`）\n *\n * @example\n * this.http.get(`my`, {\n *  context: new HttpContext().set(CACHE, { key: 'user-data' })\n * })\n */\nexport const CACHE = new HttpContextToken<CacheOptions>(() => ({}));\n","import { HttpEvent, HttpInterceptorFn, HttpResponseBase } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { map, of, OperatorFunction } from 'rxjs';\n\nimport { AlainConfigService } from '@delon/util/config';\n\nimport { CacheService } from './cache.service';\nimport { CacheOptions, CACHE } from './token';\n\n/**\n * Cache interceptor\n *\n * 缓存拦截器\n *\n * @example\n * provideHttpClient(withInterceptors([httpCacheInterceptor])),\n */\nexport const httpCacheInterceptor: HttpInterceptorFn = (req, next) => {\n  const cog = inject(AlainConfigService).merge('cache', {})!.interceptor;\n  const options: CacheOptions = {\n    enabled: true,\n    emitNotify: true,\n    saveType: 'm',\n    ...cog,\n    ...req.context.get(CACHE)\n  };\n  const srv = inject(CacheService);\n  const mapPipe: OperatorFunction<HttpEvent<any>, HttpEvent<any>> = map(ev => save(srv, ev, options));\n  if (options.enabled === false) {\n    return next(req).pipe(mapPipe);\n  }\n\n  if (options.key == null) {\n    options.key = req.urlWithParams;\n  }\n\n  const cacheData = srv.getNone<HttpEvent<any>>(options.key);\n  if (cacheData != null) {\n    if (typeof ngDevMode === 'undefined' || ngDevMode) {\n      console.log(\n        `%c👽${req.method}->${req.urlWithParams}->from cache(onle in development)`,\n        'background:#000;color:#1890ff',\n        req,\n        cacheData\n      );\n    }\n    return of(cacheData);\n  }\n\n  return next(req).pipe(mapPipe);\n};\n\nfunction save(srv: CacheService, ev: HttpEvent<any>, options: CacheOptions): HttpEvent<any> {\n  if (!(ev instanceof HttpResponseBase) || !(ev.status >= 200 && ev.status < 300)) return ev;\n  let expire = options.expire;\n  if (expire == null) {\n    const ageMatch = /max-age=(\\d+)/g.exec(ev.headers.get('cache-control')?.toLowerCase() ?? '');\n    if (ageMatch == null) return ev;\n    expire = +ageMatch[1];\n  }\n  if (expire > 0) {\n    srv.set(options.key!, ev, {\n      type: options.saveType!,\n      expire: expire\n    });\n  }\n  return ev;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}