import { httpBatchLink, loggerLink } from '@trpc/client'; import { createTRPCNext } from '@trpc/next'; import type { AppRouter } from '@/server/routers/_app'; import { inferRouterInputs, inferRouterOutputs } from '@trpc/server'; import superjson from 'superjson'; export function getBaseUrl() { if (typeof window !== 'undefined') // browser should use relative path return ''; if (process.env.VERCEL_URL) // reference for vercel.com return `https://${process.env.VERCEL_URL}`; if (process.env.RENDER_INTERNAL_HOSTNAME) // reference for render.com return `http://${process.env.RENDER_INTERNAL_HOSTNAME}:${process.env.PORT}`; // assume localhost return `http://localhost:${process.env.PORT ?? 3000}`; } export const trpc = createTRPCNext({ config({ ctx }) { return { links: [ loggerLink({ enabled: (opts) => process.env.VERCEL_ENV !== 'production', }), httpBatchLink({ /** * If you want to use SSR, you need to use the server's full URL * @link https://trpc.io/docs/ssr **/ url: `${getBaseUrl()}/api/trpc`, headers() { if (ctx?.req) { const { connection: _connection, ...headers } = ctx.req.headers; return { ...headers } } return {}; } // You can pass any HTTP headers you wish here // async headers() { // return { // authorization: getAuthCookie(), // }; // }, }), ], abortOnUnmount: true, queryClientConfig: { defaultOptions: { queries: { refetchOnWindowFocus: false, } } }, transformer: superjson }; }, /** * @link https://trpc.io/docs/ssr **/ ssr: false, }); export type RouterInput = inferRouterInputs; export type RouterOutput = inferRouterOutputs;