UNPKG

create-jaydee-app

Version:

This is a project created with Create Jaydee App.

70 lines (56 loc) 1.66 kB
import { initTRPC, TRPCError } from "@trpc/server"; import superjson from "superjson"; import { ZodError } from "zod"; import { auth } from "~/lib/auth"; import { db } from "~/server/db"; export const createTRPCContext = async (opts: { headers: Headers }) => { const session = await auth.api.getSession({ headers: opts.headers, }); return { db, session, ...opts, }; }; const t = initTRPC.context<typeof createTRPCContext>().create({ transformer: superjson, errorFormatter({ shape, error }) { return { ...shape, data: { ...shape.data, zodError: error.cause instanceof ZodError ? error.cause.flatten() : null, }, }; }, }); export const createCallerFactory = t.createCallerFactory; export const createTRPCRouter = t.router; const timingMiddleware = t.middleware(async ({ next, path }) => { const start = Date.now(); if (t._config.isDev) { // artificial delay in dev const waitMs = Math.floor(Math.random() * 400) + 100; await new Promise((resolve) => setTimeout(resolve, waitMs)); } const result = await next(); const end = Date.now(); console.log(`[TRPC] ${path} took ${end - start}ms to execute`); return result; }); export const authedMiddleware = t.middleware(async ({ ctx, next }) => { if (!ctx.session?.user) { throw new TRPCError({ code: "UNAUTHORIZED" }); } return next({ ctx: { session: { ...ctx.session, user: ctx.session.user }, }, }); }); export const publicProcedure = t.procedure.use(timingMiddleware); export const privateProcedure = t.procedure .use(timingMiddleware) .use(authedMiddleware);