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 install 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 {
experimental_ORPCMeta as ORPCMeta,
experimental_toORPCRouter as 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.
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',
},
})
INFO
Learn more about oRPC OpenAPI Specification Generation.
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,
})
}
})
],
})