{"version":3,"sources":["../src/server-query-client.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useRef, useSyncExternalStore } from \"react\";\nimport { getFarmClientDataCache, type FarmClientCacheStatus } from \"./client-cache\";\nimport { attachRevalidationListeners } from \"./client-revalidation\";\nimport type { ServerQuery } from \"./server-query\";\nimport {\n  createServerQueryCallKey,\n  fetchServerQuery,\n  type ServerQueryFetchOptions,\n} from \"./server-query-runtime\";\n\nexport {\n  beginFarmServerQueryAction,\n  completeFarmServerQueryAction,\n  fetchServerQuery,\n  prefetchServerQuery,\n  shouldApplyFarmServerQueryActionResult,\n} from \"./server-query-runtime\";\nexport type {\n  FarmServerQueryActionInvocation,\n  ServerQueryFetchOptions,\n} from \"./server-query-runtime\";\n\nexport type UseServerQueryOptions = ServerQueryFetchOptions & {\n  enabled?: boolean;\n  refetchOnWindowFocus?: boolean;\n  refetchOnReconnect?: boolean;\n};\n\nexport type UseServerQueryResult<TData> = {\n  data: TData | undefined;\n  error: Error | null;\n  status: FarmClientCacheStatus;\n  pending: boolean;\n  fetching: boolean;\n  stale: boolean;\n  refetch: () => Promise<TData>;\n};\n\nexport function useServerQuery<TInput, TData>(\n  query: ServerQuery<TInput, TData>,\n  input: TInput,\n  options: UseServerQueryOptions = {},\n): UseServerQueryResult<TData> {\n  const cache = getFarmClientDataCache();\n  const key = createServerQueryCallKey(query, input);\n  const inputRef = useRef(input);\n  const optionsRef = useRef(options);\n  const mountedKeyRef = useRef<string | undefined>(undefined);\n  const pendingInvalidationRef = useRef(false);\n  inputRef.current = input;\n  optionsRef.current = options;\n\n  const subscribe = useCallback(\n    (listener: () => void) =>\n      cache.subscribe(key, (event) => {\n        if (event === \"invalidate\") pendingInvalidationRef.current = true;\n        else if (cache.get(key)?.fetching) {\n          // A shared read consumes this invalidation for every subscriber, even\n          // when React batches its pending and error snapshots into one render.\n          pendingInvalidationRef.current = false;\n        }\n        listener();\n      }),\n    [cache, key],\n  );\n  const getSnapshot = useCallback(() => cache.get<TData>(key), [cache, key]);\n  const entry = useSyncExternalStore(subscribe, getSnapshot, () => undefined);\n\n  const run = useCallback(\n    (force = false) => {\n      pendingInvalidationRef.current = false;\n      return fetchServerQuery(query, inputRef.current, {\n        ...optionsRef.current,\n        force,\n      });\n    },\n    [query],\n  );\n\n  useEffect(() => {\n    if (options.enabled === false) {\n      // Re-enabling is a new read, even when the query/input key is unchanged.\n      mountedKeyRef.current = undefined;\n      return;\n    }\n\n    const firstReadForKey = mountedKeyRef.current !== key;\n    if (firstReadForKey) mountedKeyRef.current = key;\n    if (\n      (firstReadForKey && (!entry || cache.isStale(key))) ||\n      (pendingInvalidationRef.current && entry?.invalidatedAt !== undefined && !entry.fetching)\n    ) {\n      void run().catch(() => undefined);\n    }\n  }, [cache, entry, key, options.enabled, run]);\n\n  useEffect(() => {\n    if (options.enabled === false) return;\n\n    return attachRevalidationListeners(\n      () => {\n        if (cache.isStale(key)) void run().catch(() => undefined);\n      },\n      {\n        refetchOnWindowFocus: options.refetchOnWindowFocus,\n        refetchOnReconnect: options.refetchOnReconnect,\n      },\n    );\n  }, [cache, key, options.enabled, options.refetchOnReconnect, options.refetchOnWindowFocus, run]);\n\n  const status = entry?.status ?? (entry ? \"success\" : \"idle\");\n  const fetching = entry?.fetching ?? false;\n\n  return {\n    data: entry?.data,\n    error: entry?.error ?? null,\n    status,\n    pending: status === \"pending\" && (entry?.updatedAt ?? 0) === 0,\n    fetching,\n    stale: cache.isStale(key),\n    refetch: () => run(true),\n  };\n}\n"],"mappings":";;;;;;;;;;;;;AAEA,SAAS,aAAa,WAAW,QAAQ,4BAA4B;AAsC9D,SAAS,eACd,OACA,OACA,UAAiC,CAAC,GACL;AAC7B,QAAM,QAAQ,uBAAuB;AACrC,QAAM,MAAM,yBAAyB,OAAO,KAAK;AACjD,QAAM,WAAW,OAAO,KAAK;AAC7B,QAAM,aAAa,OAAO,OAAO;AACjC,QAAM,gBAAgB,OAA2B,MAAS;AAC1D,QAAM,yBAAyB,OAAO,KAAK;AAC3C,WAAS,UAAU;AACnB,aAAW,UAAU;AAErB,QAAM,YAAY;AAAA,IAChB,CAAC,aACC,MAAM,UAAU,KAAK,CAAC,UAAU;AAC9B,UAAI,UAAU,aAAc,wBAAuB,UAAU;AAAA,eACpD,MAAM,IAAI,GAAG,GAAG,UAAU;AAGjC,+BAAuB,UAAU;AAAA,MACnC;AACA,eAAS;AAAA,IACX,CAAC;AAAA,IACH,CAAC,OAAO,GAAG;AAAA,EACb;AACA,QAAM,cAAc,YAAY,MAAM,MAAM,IAAW,GAAG,GAAG,CAAC,OAAO,GAAG,CAAC;AACzE,QAAM,QAAQ,qBAAqB,WAAW,aAAa,MAAM,MAAS;AAE1E,QAAM,MAAM;AAAA,IACV,CAAC,QAAQ,UAAU;AACjB,6BAAuB,UAAU;AACjC,aAAO,iBAAiB,OAAO,SAAS,SAAS;AAAA,QAC/C,GAAG,WAAW;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,CAAC,KAAK;AAAA,EACR;AAEA,YAAU,MAAM;AACd,QAAI,QAAQ,YAAY,OAAO;AAE7B,oBAAc,UAAU;AACxB;AAAA,IACF;AAEA,UAAM,kBAAkB,cAAc,YAAY;AAClD,QAAI,gBAAiB,eAAc,UAAU;AAC7C,QACG,oBAAoB,CAAC,SAAS,MAAM,QAAQ,GAAG,MAC/C,uBAAuB,WAAW,OAAO,kBAAkB,UAAa,CAAC,MAAM,UAChF;AACA,WAAK,IAAI,EAAE,MAAM,MAAM,MAAS;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,OAAO,OAAO,KAAK,QAAQ,SAAS,GAAG,CAAC;AAE5C,YAAU,MAAM;AACd,QAAI,QAAQ,YAAY,MAAO;AAE/B,WAAO;AAAA,MACL,MAAM;AACJ,YAAI,MAAM,QAAQ,GAAG,EAAG,MAAK,IAAI,EAAE,MAAM,MAAM,MAAS;AAAA,MAC1D;AAAA,MACA;AAAA,QACE,sBAAsB,QAAQ;AAAA,QAC9B,oBAAoB,QAAQ;AAAA,MAC9B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,KAAK,QAAQ,SAAS,QAAQ,oBAAoB,QAAQ,sBAAsB,GAAG,CAAC;AAE/F,QAAM,SAAS,OAAO,WAAW,QAAQ,YAAY;AACrD,QAAM,WAAW,OAAO,YAAY;AAEpC,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,OAAO,OAAO,SAAS;AAAA,IACvB;AAAA,IACA,SAAS,WAAW,cAAc,OAAO,aAAa,OAAO;AAAA,IAC7D;AAAA,IACA,OAAO,MAAM,QAAQ,GAAG;AAAA,IACxB,SAAS,6BAAM,IAAI,IAAI,GAAd;AAAA,EACX;AACF;AApFgB;","names":[]}