The fetch adapter exposes your router over the standard Fetch API. It works in any environment that supports Request and Response: Cloudflare Workers, Deno, Bun, and modern Node.js.
Installation
The fetch adapter is included in @orpc/server. Import from the subpath:
import { RPCHandler } from '@orpc/server/fetch'
Basic usage
import { RPCHandler } from '@orpc/server/fetch'
import { CORSPlugin } from '@orpc/server/plugins'
import { router } from './router'
const handler = new RPCHandler(router, {
plugins: [new CORSPlugin()],
})
export default {
async fetch(request: Request): Promise<Response> {
const result = await handler.handle(request, {
context: {}, // initial context
})
if (!result.matched) {
return new Response('Not found', { status: 404 })
}
return result.response
},
}
handle(request, options)
The handle method processes a single request:
| Parameter | Type | Description |
|---|
request | Request | The incoming fetch Request |
options.context | Initial context type | Context passed to the first middleware |
options.prefix | string (optional) | Strip this prefix before routing |
Returns { matched: true, response: Response } if a procedure was matched, or { matched: false, response: undefined } otherwise.
Cloudflare Workers
import { RPCHandler } from '@orpc/server/fetch'
import { router } from './router'
const handler = new RPCHandler(router)
export default {
async fetch(
request: Request,
env: Env,
ctx: ExecutionContext,
): Promise<Response> {
const result = await handler.handle(request, {
context: { env, ctx }, // pass Cloudflare bindings as context
})
if (!result.matched) {
return new Response('Not found', { status: 404 })
}
return result.response
},
}
Bun
import { RPCHandler } from '@orpc/server/fetch'
import { router } from './router'
const handler = new RPCHandler(router)
Bun.serve({
port: 3000,
async fetch(request: Request) {
const result = await handler.handle(request)
if (!result.matched) {
return new Response('Not found', { status: 404 })
}
return result.response
},
})
Deno
import { RPCHandler } from 'npm:@orpc/server/fetch'
import { router } from './router.ts'
const handler = new RPCHandler(router)
Deno.serve(async (request: Request) => {
const result = await handler.handle(request)
if (!result.matched) {
return new Response('Not found', { status: 404 })
}
return result.response
})
Options
Array of plugins to apply to the handler. See Plugins for available plugins.
strictGetMethodPluginEnabled
When enabled, non-mutation procedures are restricted to GET requests. Disable only if you have a specific reason.
Low-level interceptors that run around the entire fetch handling cycle.