oRPC v2 is now public beta -
Learn More
The screenshot API for developers -
Try ScreenshotOne
Skip to content

tRPC Integration

This guide explains how to integrate oRPC with tRPC, allowing you to leverage oRPC features in your existing tRPC applications.

Installation

sh
npm install @orpc/trpc@latest
sh
yarn add @orpc/trpc@latest
sh
pnpm add @orpc/trpc@latest
sh
bun add @orpc/trpc@latest
sh
deno add npm:@orpc/trpc@latest

OpenAPI Support

By converting a tRPC router to an oRPC router, you can utilize most oRPC features, including OpenAPI specification generation and request handling.

ts
import { ORPCMeta, toORPCRouter } from '@orpc/trpc'

export const t = initTRPC.context<Context>().meta<ORPCMeta>().create()

const orpcRouter = toORPCRouter(trpcRouter)

WARNING

Ensure you set the .meta type to ORPCMeta when creating your tRPC builder. This is required for OpenAPI features to function properly.

ts
const example = t.procedure
  .meta({ route: { path: '/hello', summary: 'Hello procedure' } }) 
  .input(z.object({ name: z.string() }))
  .query(({ input }) => {
    return `Hello, ${input.name}!`
  })

Specification Generation

ts
const openAPIGenerator = new OpenAPIGenerator({
  schemaConverters: [
    new ZodToJsonSchemaConverter(), // <-- if you use Zod
    new ValibotToJsonSchemaConverter(), // <-- if you use Valibot
    new ArkTypeToJsonSchemaConverter(), // <-- if you use ArkType
  ],
})

const spec = await openAPIGenerator.generate(orpcRouter, {
  info: {
    title: 'My App',
    version: '0.0.0',
  },
})

Request Handling

ts
const handler = new OpenAPIHandler(orpcRouter, {
  plugins: [new CORSPlugin()],
  interceptors: [
    onError((error) => {
      console.error(error)
    }),
  ],
})

export async function fetch(request: Request) {
  const { matched, response } = await handler.handle(request, {
    prefix: '/api',
    context: {} // Add initial context if needed
  })

  return response ?? new Response('Not Found', { status: 404 })
}

INFO

Learn more about oRPC OpenAPI Handler.

Error Formatting

The toORPCRouter does not support tRPC Error Formatting. You should catch errors and format them manually using interceptors:

ts
const handler = new OpenAPIHandler(orpcRouter, {
  interceptors: [
    onError((error) => {
      if (
        error instanceof ORPCError
        && error.cause instanceof TRPCError
        && error.cause.cause instanceof ZodError
      ) {
        throw new ORPCError('INPUT_VALIDATION_FAILED', {
          status: 422,
          data: error.cause.cause.flatten(),
          cause: error.cause.cause,
        })
      }
    })
  ],
})

Released under the MIT License.