{"version":3,"file":"nextCache.mjs","names":[],"sources":["../../../src/app-dir/links/nextCache.ts"],"sourcesContent":["// import \"server-only\";\n\nimport type { TRPCLink } from '@trpc/client';\nimport { TRPCClientError } from '@trpc/client';\nimport {\n  getTransformer,\n  type TransformerOptions,\n} from '@trpc/client/unstable-internals';\nimport { observable } from '@trpc/server/observable';\nimport type {\n  AnyRouter,\n  inferClientTypes,\n  inferRouterContext,\n} from '@trpc/server/unstable-core-do-not-import';\nimport { callProcedure } from '@trpc/server/unstable-core-do-not-import';\nimport { unstable_cache } from 'next/cache';\nimport { generateCacheTag } from '../shared';\n\ntype NextCacheLinkOptions<TRouter extends AnyRouter> = {\n  router: TRouter;\n  createContext: () => Promise<inferRouterContext<TRouter>>;\n  /** how many seconds the cache should hold before revalidating */\n  revalidate?: number | false;\n} & TransformerOptions<inferClientTypes<TRouter>>;\n\n// ts-prune-ignore-next\nexport function experimental_nextCacheLink<TRouter extends AnyRouter>(\n  opts: NextCacheLinkOptions<TRouter>,\n): TRPCLink<TRouter> {\n  const transformer = getTransformer(opts.transformer);\n  return () =>\n    ({ op }) =>\n      observable((observer) => {\n        const { path, input, type, context } = op;\n\n        const cacheTag = generateCacheTag(path, input);\n        // Let per-request revalidate override global revalidate\n        const requestRevalidate =\n          typeof context['revalidate'] === 'number' ||\n          context['revalidate'] === false\n            ? context['revalidate']\n            : undefined;\n        const revalidate = requestRevalidate ?? opts.revalidate ?? false;\n\n        const promise = opts\n          .createContext()\n          .then(async (ctx) => {\n            const callProc = async (_cachebuster: string) => {\n              //   // _cachebuster is not used by us but to make sure\n              //   // that calls with different tags are properly separated\n              //   // @link https://github.com/trpc/trpc/issues/4622\n              const procedureResult = await callProcedure({\n                router: opts.router,\n                path,\n                getRawInput: async () => input,\n                ctx: ctx,\n                type,\n                signal: undefined,\n                batchIndex: 0,\n              });\n\n              // We need to serialize cause the cache only accepts JSON\n              return transformer.input.serialize(procedureResult);\n            };\n\n            if (type === 'query') {\n              return unstable_cache(callProc, path.split('.'), {\n                revalidate,\n                tags: [cacheTag],\n              })(cacheTag);\n            }\n\n            return callProc(cacheTag);\n          })\n          .catch((cause) => {\n            observer.error(TRPCClientError.from(cause));\n          });\n\n        promise\n          .then((data) => {\n            const transformedResult = transformer.output.deserialize(data);\n            observer.next({ result: { data: transformedResult } });\n            observer.complete();\n          })\n          .catch((cause) => {\n            observer.error(TRPCClientError.from(cause));\n          });\n      });\n}\n"],"mappings":";;;;;;;AA0BA,SAAgB,2BACd,MACmB;CACnB,MAAM,cAAc,eAAe,KAAK,WAAW;CACnD,cACG,EAAE,SACD,YAAY,aAAa;;EACvB,MAAM,EAAE,MAAM,OAAO,MAAM,YAAY;EAEvC,MAAM,WAAW,iBAAiB,MAAM,KAAK;EAE7C,MAAM,oBACJ,OAAO,QAAQ,kBAAkB,YACjC,QAAQ,kBAAkB,QACtB,QAAQ,gBACR,KAAA;EACN,MAAM,cAAA,OAAa,sBAAA,QAAA,sBAAA,KAAA,IAAA,oBAAqB,KAAK,gBAAA,QAAA,SAAA,KAAA,IAAA,OAAc;EAoC3D,KAjCG,cAAc,CAAC,CACf,KAAK,OAAO,QAAQ;GACnB,MAAM,WAAW,OAAO,iBAAyB;IAI/C,MAAM,kBAAkB,MAAM,cAAc;KAC1C,QAAQ,KAAK;KACb;KACA,aAAa,YAAY;KACpB;KACL;KACA,QAAQ,KAAA;KACR,YAAY;IACd,CAAC;IAGD,OAAO,YAAY,MAAM,UAAU,eAAe;GACpD;GAEA,IAAI,SAAS,SACX,OAAO,eAAe,UAAU,KAAK,MAAM,GAAG,GAAG;IAC/C;IACA,MAAM,CAAC,QAAQ;GACjB,CAAC,CAAC,CAAC,QAAQ;GAGb,OAAO,SAAS,QAAQ;EAC1B,CAAC,CAAC,CACD,OAAO,UAAU;GAChB,SAAS,MAAM,gBAAgB,KAAK,KAAK,CAAC;EAC5C,CAEI,CAAC,CACJ,MAAM,SAAS;GACd,MAAM,oBAAoB,YAAY,OAAO,YAAY,IAAI;GAC7D,SAAS,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,EAAE,CAAC;GACrD,SAAS,SAAS;EACpB,CAAC,CAAC,CACD,OAAO,UAAU;GAChB,SAAS,MAAM,gBAAgB,KAAK,KAAK,CAAC;EAC5C,CAAC;CACL,CAAC;AACP"}