| title | OpenAPI Handler |
|---|---|
| description | Comprehensive Guide to the OpenAPIHandler in oRPC |
The OpenAPIHandler enables communication with clients over RESTful APIs, adhering to the OpenAPI specification. It is fully compatible with OpenAPILink and the OpenAPI Specification.
OpenAPIHandler serializes and deserializes the following JavaScript types:
- string
- number (
NaNβnull) - boolean
- null
- undefined (
undefinedin arrays βnull) - Date (
Invalid Dateβnull) - BigInt (
BigIntβstring) - RegExp (
RegExpβstring) - URL (
URLβstring) - Record (object)
- Array
- Set (
Setβarray) - Map (
Mapβarray) - Blob (unsupported in
AsyncIteratorObject) - File (unsupported in
AsyncIteratorObject) - AsyncIteratorObject (only at the root level; powers the Event Iterator)
- ReadableStream<Uint8Array> (supported only at the root level in
OpenAPIHandler; not supported by client-sideOpenAPILinkuntil v2)
::: warning
If a payload contains Blob or File outside the root level, it must use multipart/form-data. In such cases, oRPC applies Bracket Notation and converts other types to strings (exclude null and undefined will not be represented).
:::
:::tip You can extend the list of supported types by creating a custom serializer. :::
::: code-group
npm install @orpc/openapi@latestyarn add @orpc/openapi@latestpnpm add @orpc/openapi@latestbun add @orpc/openapi@latestdeno add npm:@orpc/openapi@latest:::
import { OpenAPIHandler } from '@orpc/openapi/fetch' // or '@orpc/server/node'
import { CORSPlugin } from '@orpc/server/plugins'
import { onError } from '@orpc/server'
const handler = new OpenAPIHandler(router, {
plugins: [new CORSPlugin()],
interceptors: [
onError((error) => {
console.error(error)
}),
],
})
export default async function fetch(request: Request) {
const { matched, response } = await handler.handle(request, {
prefix: '/api',
context: {} // Add initial context if needed
})
if (matched) {
return response
}
return new Response('Not Found', { status: 404 })
}You can filter a procedure from matching by using the filter option:
const handler = new OpenAPIHandler(router, {
filter: ({ contract, path }) => !contract['~orpc'].route.tags?.includes('internal'),
})The OpenAPIHandler follows the same lifecycle as the RPCHandler Lifecycle, ensuring consistent behavior across different handler types.