{"version":3,"sources":["../../src/use-query/use-query-cache.ts"],"sourcesContent":["import { useCreation } from '../use-creation'\nimport { useEffectOnce } from '../use-effect-once'\nimport { useLatest } from '../use-latest'\nimport { useRender } from '../use-render'\nimport { useStableFn } from '../use-stable-fn'\nimport { isDefined, isFunction, isNumber } from '../utils/basic'\nimport { shallowEqual } from '../utils/equal'\nimport { unwrapArrayable, unwrapGettable } from '../utils/unwrap'\n\nimport type { SetStateAction } from 'react'\nimport type { AnyFunc, Arrayable, Gettable, SetTimeoutReturn } from '../utils/basic'\n\nexport interface UseQueryCacheLike<Data> {\n  get(key: string): Data | undefined\n  set(key: string, value: Data): void\n  delete(key: string): void\n  keys(): IterableIterator<string>\n}\n\nconst dataCache: UseQueryCacheLike<unknown> = /* #__PURE__ */ new Map()\nconst paramsCache: Map<string, unknown[]> = /* #__PURE__ */ new Map()\nconst timerCache: Map<string, SetTimeoutReturn> = /* #__PURE__ */ new Map()\nconst promiseCache: Map<string, Promise<unknown>> = /* #__PURE__ */ new Map()\nconst staleCache: Set<string> = /* #__PURE__ */ new Set()\n\nconst cacheBus = createEventBus()\n\nexport function useQueryCache<T extends AnyFunc, D = Awaited<ReturnType<T>>>(\n  options: {\n    provider?: Gettable<UseQueryCacheLike<D>>\n    cacheKey?: string | ((...args: Parameters<T> | []) => string)\n    cacheExpirationTime?: number | false\n    compare?: (prevData: D | undefined, nextData: D | undefined) => boolean\n  } = {},\n): [\n  { data: D | undefined; params: Parameters<T> | []; stale: boolean },\n  {\n    setCache: (value: D | undefined, params?: Parameters<T> | []) => void\n    getPromiseCache: () => Promise<unknown> | undefined\n    setPromiseCache: (promise: Promise<D>) => void\n    clearPromiseCache: () => void\n    isCacheEnabled: boolean\n  },\n] {\n  const render = useRender()\n  const provider = unwrapGettable(options.provider) || dataCache\n  const cacheKeyValue = unwrapGettable(options.cacheKey)\n  const cachedData = (cacheKeyValue ? provider.get(cacheKeyValue) : undefined) as D | undefined\n  const cachedParams = (cacheKeyValue ? (paramsCache.get(cacheKeyValue) ?? []) : []) as Parameters<T> | []\n  const cachedStale = Boolean(cacheKeyValue && staleCache.has(cacheKeyValue))\n  const cacheExpirationTime = options.cacheExpirationTime ?? 5 * 60_000\n\n  const latest = useLatest({\n    provider,\n    cacheKeyValue,\n    cacheExpirationTime,\n    compare: options.compare ?? shallowEqual,\n  })\n\n  useEffectOnce(() => {\n    if (cacheKeyValue) {\n      return cacheBus.on(cacheKeyValue, render)\n    }\n  })\n\n  function resetCacheTimer() {\n    const { provider, cacheKeyValue, cacheExpirationTime } = latest.current\n\n    if (!cacheKeyValue || cacheExpirationTime === false) return\n\n    const timer = timerCache.get(cacheKeyValue)\n\n    if (timer) {\n      clearTimeout(timer)\n      timerCache.delete(cacheKeyValue)\n    }\n\n    if (isNumber(cacheExpirationTime)) {\n      const timer = setTimeout(() => {\n        staleCache.add(cacheKeyValue)\n        timerCache.delete(cacheKeyValue)\n        cacheBus.emit(cacheKeyValue)\n      }, cacheExpirationTime)\n\n      timerCache.set(cacheKeyValue, timer)\n    }\n  }\n\n  const setCache = useStableFn((value: D | undefined, params: Parameters<T> | [] = []) => {\n    const { provider, cacheKeyValue } = latest.current\n\n    if (!cacheKeyValue) return\n\n    const preValue = provider.get(cacheKeyValue) as D | undefined\n    const preParams = paramsCache.get(cacheKeyValue) as Parameters<T> | [] | undefined\n    const wasStale = staleCache.has(cacheKeyValue)\n\n    if (isDefined(value) && shallowEqual(preValue, value) && shallowEqual(preParams, params)) {\n      if (wasStale) {\n        staleCache.delete(cacheKeyValue)\n        resetCacheTimer()\n        cacheBus.emit(cacheKeyValue)\n      }\n      return\n    }\n\n    if (!isDefined(value)) {\n      provider.delete(cacheKeyValue)\n      timerCache.delete(cacheKeyValue)\n      staleCache.delete(cacheKeyValue)\n    } else {\n      provider.set(cacheKeyValue, value)\n      staleCache.delete(cacheKeyValue)\n      resetCacheTimer()\n    }\n\n    paramsCache.set(cacheKeyValue, params)\n\n    if (wasStale || !latest.current.compare(preValue, value) || !shallowEqual(preParams, params)) {\n      cacheBus.emit(cacheKeyValue)\n    }\n  })\n\n  const getPromiseCache = useStableFn(() => {\n    const { cacheKeyValue = '' } = latest.current\n    return promiseCache.get(cacheKeyValue)\n  })\n\n  const setPromiseCache = useStableFn((promise: Promise<D>) => {\n    const { cacheKeyValue = '' } = latest.current\n    promiseCache.set(cacheKeyValue, promise)\n  })\n\n  const clearPromiseCache = useStableFn(() => {\n    const { cacheKeyValue } = latest.current\n    if (!cacheKeyValue) return\n    promiseCache.delete(cacheKeyValue)\n  })\n\n  const isCacheEnabled = Boolean(latest.current.cacheKeyValue)\n\n  const actions = useCreation(() => ({\n    setCache,\n    getPromiseCache,\n    setPromiseCache,\n    clearPromiseCache,\n    isCacheEnabled,\n  }))\n\n  return [{ data: cachedData, params: cachedParams, stale: cachedStale }, actions] as const\n}\n\nexport const mutate: UseQueryMutate = /* #__PURE__ */ createMutate(dataCache, paramsCache)\n\nexport type UseQueryMutate = (\n  keyFilter: Arrayable<string> | ((key: string) => boolean),\n  value?: SetStateAction<unknown>,\n  params?: SetStateAction<unknown[]>,\n) => void\n\nfunction createMutate(dataCache: UseQueryCacheLike<unknown>, paramsCache: Map<string, unknown[]>): UseQueryMutate {\n  return (\n    keyFilter: Arrayable<string> | ((key: string) => boolean),\n    value: SetStateAction<unknown> = undefined,\n    params: SetStateAction<unknown[]> = [],\n  ) => {\n    const keys = isFunction(keyFilter)\n      ? Array.from(dataCache.keys()).filter(keyFilter)\n      : unwrapArrayable(keyFilter).filter(Boolean)\n\n    for (const key of keys) {\n      const prevData = dataCache.get(key)\n      const nextData = isFunction(value) ? value(prevData) : value\n      const prevParams = paramsCache.get(key) ?? []\n      const nextParams = isFunction(params) ? params(prevParams) : params\n\n      if (isDefined(nextData)) {\n        dataCache.set(key, nextData)\n      } else {\n        dataCache.delete(key)\n      }\n\n      staleCache.delete(key)\n      paramsCache.set(key, nextParams)\n\n      cacheBus.emit(key)\n    }\n  }\n}\n\nfunction createEventBus() {\n  const listeners = new Map<string, Set<() => void>>()\n\n  function on(eventName: string, listener: () => void) {\n    const set = listeners.get(eventName) || new Set()\n    set.add(listener)\n    listeners.set(eventName, set)\n    return () => off(eventName, listener)\n  }\n\n  function off(eventName: string, listener: () => void) {\n    const set = listeners.get(eventName)\n    set?.delete(listener)\n    if (set?.size === 0) listeners.delete(eventName)\n  }\n\n  function emit(eventName: string) {\n    const set = listeners.get(eventName)\n    if (!set) return\n    for (const listener of set) listener()\n  }\n\n  return { on, emit }\n}\n"],"names":["mutate","useQueryCache","dataCache","Map","paramsCache","timerCache","promiseCache","staleCache","Set","cacheBus","createEventBus","options","render","useRender","provider","unwrapGettable","cacheKeyValue","cacheKey","cachedData","get","undefined","cachedParams","cachedStale","Boolean","has","cacheExpirationTime","latest","useLatest","compare","shallowEqual","useEffectOnce","on","resetCacheTimer","current","timer","clearTimeout","delete","isNumber","setTimeout","add","emit","set","setCache","useStableFn","value","params","preValue","preParams","wasStale","isDefined","getPromiseCache","setPromiseCache","promise","clearPromiseCache","isCacheEnabled","actions","useCreation","data","stale","createMutate","keyFilter","keys","isFunction","Array","from","filter","unwrapArrayable","key","prevData","nextData","prevParams","nextParams","listeners","eventName","listener","off","size"],"mappings":"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"}