{"version":3,"file":"nextCache.mjs","names":["opts: NextCacheLinkOptions<TRouter>","_cachebuster: string"],"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,2BACdA,MACmB;CACnB,MAAM,cAAc,eAAe,KAAK,YAAY;AACpD,QAAO,MACL,CAAC,EAAE,IAAI,KACL,WAAW,CAAC,aAAa;;EACvB,MAAM,EAAE,MAAM,OAAO,MAAM,SAAS,GAAG;EAEvC,MAAM,WAAW,iBAAiB,MAAM,MAAM;EAE9C,MAAM,2BACG,QAAQ,kBAAkB,YACjC,QAAQ,kBAAkB,QACtB,QAAQ;EAEd,MAAM,qBAAa,iFAAqB,KAAK,iDAAc;EAE3D,MAAM,UAAU,KACb,eAAe,CACf,KAAK,OAAO,QAAQ;GACnB,MAAM,WAAW,OAAOC,iBAAyB;IAI/C,MAAM,kBAAkB,MAAM,cAAc;KAC1C,QAAQ,KAAK;KACb;KACA,aAAa,YAAY;KACpB;KACL;KACA;KACA,YAAY;IACb,EAAC;AAGF,WAAO,YAAY,MAAM,UAAU,gBAAgB;GACpD;AAED,OAAI,SAAS,QACX,QAAO,eAAe,UAAU,KAAK,MAAM,IAAI,EAAE;IAC/C;IACA,MAAM,CAAC,QAAS;GACjB,EAAC,CAAC,SAAS;AAGd,UAAO,SAAS,SAAS;EAC1B,EAAC,CACD,MAAM,CAAC,UAAU;AAChB,YAAS,MAAM,gBAAgB,KAAK,MAAM,CAAC;EAC5C,EAAC;AAEJ,UACG,KAAK,CAAC,SAAS;GACd,MAAM,oBAAoB,YAAY,OAAO,YAAY,KAAK;AAC9D,YAAS,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAmB,EAAE,EAAC;AACtD,YAAS,UAAU;EACpB,EAAC,CACD,MAAM,CAAC,UAAU;AAChB,YAAS,MAAM,gBAAgB,KAAK,MAAM,CAAC;EAC5C,EAAC;CACL,EAAC;AACP"}