@trpc/next
Version:
1 lines • 4.26 kB
Source Map (JSON)
{"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 });\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;IACD,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"}