{"version":3,"sources":["../../src/cache/decoratorCache.ts"],"names":["state","container","WeakMap","extractDescriptor","descriptor","value","update","get","Error","Cache","name","getInstanceContext","target","ctx","instances","has","set","cache","Map","options","initQueue","_options","baseOptions","enabled","cacheKey","ObjectHashKeyFn","ttl","Infinity","enumerable","R","pickBy","isDefined","handler","obj","key","Object","hasOwn","constructor","Boolean","push","SingletonCacheKeyFn","groupContext","fn","wrapper","args","invokeOriginal","apply","inputHash","expiresAt","Date","now","result","data","defineProperty","init","self","task","getOwnPropertyDescriptor","prototype","assign","delete","getInstance","property","findDescriptor","TypeError","String","ctxByInstance","clear","keys","forEach","oldTTL","newTTL","undefined","values","diff","isEnabled","enable","disable","WeakRefKeyFn","_lookup","chunks","map","isObjectType","isFunction","createRandomHash","createHash","JSON","stringify","from","cb","join","hash","encoding","replacer","AbortSignal","unorderedArrays","unorderedObjects","unorderedSets","JSONCacheKeyFn","CacheFn","Function","create","instance","Proxy","_","prop","receiver","updateTTL","createSnapshot"],"mappings":"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","file":"decoratorCache.cjs","sourcesContent":["/**\n * Copyright 2025 IBM Corp.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AnyFn, TypedFn } from \"@/internals/types.js\";\nimport * as R from \"remeda\";\nimport hash from \"object-hash\";\nimport { createHash, createRandomHash } from \"@/internals/helpers/hash.js\";\nimport { findDescriptor } from \"@/internals/helpers/prototype.js\";\n\ntype InputFn = AnyFn;\ntype TargetFn = AnyFn;\ntype Instance = NonNullable<any>;\n\ntype CacheKeyFn = (this: Instance, ...args: any[]) => string;\n\nexport interface CacheDecoratorOptions {\n  enabled: boolean;\n  ttl?: number;\n  cacheKey: CacheKeyFn;\n  enumerable?: boolean;\n}\n\ninterface CacheEntry {\n  expiresAt: number;\n  data: any;\n}\n\ninterface FnContext {\n  options: CacheDecoratorOptions;\n  cache: Map<string, CacheEntry>;\n}\n\ninterface GroupContext {\n  options: CacheDecoratorOptions;\n  instances: WeakMap<Instance, FnContext>;\n}\n\nexport interface CacheDecoratorInstance {\n  get(key?: string): CacheEntry | undefined;\n\n  clear(keys?: string[]): void;\n\n  isEnabled(): boolean;\n\n  enable(): void;\n\n  disable(): void;\n\n  update(data: Partial<CacheDecoratorOptions>): void;\n}\n\nconst state = {\n  container: new WeakMap<InputFn, GroupContext>(),\n  extractDescriptor(descriptor: PropertyDescriptor) {\n    // Method approach\n    if (descriptor.value != null) {\n      return {\n        value: descriptor.value as AnyFn,\n        update: (value: TargetFn) => {\n          descriptor.value = value;\n        },\n      };\n    }\n    // Accessor approach\n    if (descriptor.get != null) {\n      return {\n        value: descriptor.get as AnyFn,\n        update: (value: TargetFn) => {\n          descriptor.get = value;\n        },\n      };\n    }\n    throw new Error(`@${Cache.name} decorator must be either on a method or get accessor.`);\n  },\n  getInstanceContext<T extends NonNullable<unknown>>(target: T, ctx: GroupContext) {\n    if (!ctx.instances.has(target)) {\n      ctx.instances.set(target, {\n        cache: new Map(),\n        options: ctx.options,\n      });\n    }\n    return ctx.instances.get(target)!;\n  },\n} as const;\n\nconst initQueue = new WeakMap<Instance, { key: PropertyKey; enumerable: boolean }[]>();\n\nexport function Cache(_options?: Partial<CacheDecoratorOptions>) {\n  const baseOptions: Required<CacheDecoratorOptions> = {\n    enabled: true,\n    cacheKey: ObjectHashKeyFn,\n    ttl: Infinity,\n    enumerable: false,\n    ...R.pickBy(_options ?? {}, R.isDefined),\n  };\n\n  return function handler(\n    obj: NonNullable<object>,\n    key: string | symbol,\n    descriptor: PropertyDescriptor,\n  ) {\n    if (Object.hasOwn(obj, \"constructor\")) {\n      const constructor = obj.constructor;\n      if (!initQueue.has(constructor)) {\n        initQueue.set(constructor, []);\n      }\n\n      baseOptions.enumerable = Boolean(descriptor.get);\n      initQueue\n        .get(constructor)!\n        .push({ key, enumerable: _options?.enumerable ?? baseOptions.enumerable });\n    }\n\n    const target = state.extractDescriptor(descriptor);\n    if (descriptor.get && !_options?.cacheKey) {\n      baseOptions.cacheKey = SingletonCacheKeyFn;\n    }\n\n    const groupContext: GroupContext = { instances: new WeakMap(), options: baseOptions };\n\n    const fn = function wrapper(this: any, ...args: any[]) {\n      const invokeOriginal = () => target.value.apply(this, args);\n      const ctx = state.getInstanceContext(this, groupContext);\n      if (!ctx.options.enabled) {\n        return invokeOriginal();\n      }\n\n      const inputHash = ctx.options.cacheKey.apply(this, args);\n      if (\n        !ctx.cache.has(inputHash) ||\n        (ctx.cache.get(inputHash)?.expiresAt ?? Infinity) < Date.now() // is expired check\n      ) {\n        const result = invokeOriginal();\n        ctx.cache.set(inputHash, {\n          expiresAt: Date.now() + (ctx.options.ttl ?? Infinity),\n          data: result,\n        });\n      }\n      return ctx.cache.get(inputHash)!.data;\n    };\n    Object.defineProperty(fn, \"name\", {\n      get: () => target.value.name ?? \"anonymous\",\n    });\n\n    target.update(fn);\n    state.container.set(fn, groupContext);\n  };\n}\n\nCache.init = function init<T extends NonNullable<unknown>>(self: T) {\n  const task = initQueue.get(self.constructor) ?? [];\n  for (const { key, enumerable } of task) {\n    const descriptor = Object.getOwnPropertyDescriptor(self.constructor.prototype, key);\n    if (descriptor) {\n      Object.defineProperty(self, key, Object.assign(descriptor, { enumerable }));\n    }\n  }\n  initQueue.delete(self);\n};\n\nCache.getInstance = function getInstance<T extends NonNullable<unknown>>(\n  target: T,\n  property: keyof T,\n): CacheDecoratorInstance {\n  const descriptor = findDescriptor(target, property);\n  if (!descriptor) {\n    throw new TypeError(`No descriptor has been found for '${String(property)}'`);\n  }\n  const value = state.extractDescriptor(descriptor);\n  const ctxByInstance = state.container.get(value.value);\n  if (!ctxByInstance) {\n    throw new TypeError(`No cache instance is bounded to '${String(property)}'!`);\n  }\n\n  const ctx = state.getInstanceContext(target, ctxByInstance);\n  return {\n    get(key = \"\") {\n      return ctx.cache.get(key);\n    },\n    clear(keys?: string[]) {\n      if (keys) {\n        keys.forEach((key) => ctx.cache.delete(key));\n      } else {\n        ctx.cache.clear();\n      }\n    },\n    update(data: CacheDecoratorOptions) {\n      const oldTTL = ctx.options.ttl;\n      const newTTL = data.ttl;\n      if (oldTTL !== newTTL && newTTL !== undefined) {\n        for (const value of ctx.cache.values()) {\n          if (value.expiresAt === Infinity) {\n            value.expiresAt = Date.now() + newTTL;\n          } else {\n            const diff = newTTL - (oldTTL ?? 0);\n            value.expiresAt += diff;\n          }\n        }\n      }\n      Object.assign(ctx.options, data);\n    },\n    isEnabled() {\n      return ctx.options.enabled;\n    },\n    enable() {\n      ctx.options.enabled = true;\n    },\n    disable() {\n      ctx.options.enabled = false;\n    },\n  };\n};\n\nexport const WeakRefKeyFn = (() => {\n  const _lookup = new WeakMap();\n\n  const fn = (...args: any[]) => {\n    const chunks = args.map((value) => {\n      if (R.isObjectType(value) || R.isFunction(value)) {\n        if (!_lookup.has(value)) {\n          _lookup.set(value, createRandomHash(6));\n        }\n        return _lookup.get(value)!;\n      }\n      return value;\n    });\n    return createHash(JSON.stringify(chunks));\n  };\n  fn.from = <T>(cb: (self: T) => any[]) => {\n    return function (this: T) {\n      return cb(this).map(fn).join(\"#\");\n    };\n  };\n  return fn;\n})() satisfies CacheKeyFn;\n\nexport const ObjectHashKeyFn: CacheKeyFn = (...args: any[]) =>\n  hash(args, {\n    encoding: \"base64\",\n    replacer: (() => {\n      const _lookup = new WeakMap();\n      return (value: unknown) => {\n        if (value && value instanceof AbortSignal) {\n          // not supported by \"hash\" function\n          if (!_lookup.has(value)) {\n            _lookup.set(value, createRandomHash(6));\n          }\n          return _lookup.get(value)!;\n        }\n        return value;\n      };\n    })(),\n    unorderedArrays: false,\n    unorderedObjects: false,\n    unorderedSets: false,\n  });\nexport const JSONCacheKeyFn: CacheKeyFn = (...args: any[]) => JSON.stringify(args);\n// eslint-disable-next-line unused-imports/no-unused-vars\nexport const SingletonCacheKeyFn: CacheKeyFn = (...args: any[]) => \"\";\n\nexport class CacheFn<P extends any[], R> extends Function {\n  readonly name = CacheFn.name;\n\n  static create<A extends any[], B>(\n    fn: (...args: A) => B,\n    options?: Partial<CacheDecoratorOptions>,\n  ) {\n    const instance = new CacheFn(fn, options);\n    return instance as TypedFn<A, B> & CacheFn<A, B>;\n  }\n\n  constructor(\n    protected readonly fn: (...args: P) => R,\n    protected readonly options?: Partial<CacheDecoratorOptions>,\n  ) {\n    super();\n\n    Cache.getInstance(this, \"get\").update(options ?? {});\n    return new Proxy<typeof this>(this, {\n      apply(this: CacheFn<P, R>, target, _, args: any[]) {\n        return target.get(...(args as unknown as P));\n      },\n      get(target, prop: string | symbol, receiver: any) {\n        const value = target[prop as keyof typeof target];\n        if (value instanceof Function) {\n          return function (this: CacheFn<P, R>, ...args: P) {\n            return value.apply(this === receiver ? target : this, args);\n          };\n        }\n        return value;\n      },\n    }) as unknown as CacheFn<P, R> & typeof fn;\n  }\n\n  updateTTL(ttl: number) {\n    Cache.getInstance(this, \"get\").update({ ttl });\n  }\n\n  createSnapshot() {\n    return {\n      fn: this.fn,\n      options: this.options,\n    };\n  }\n\n  @Cache()\n  get(...args: P) {\n    return this.fn(...args);\n  }\n}\n"]}