---
changelog:
  category: Release
  version: 1.11.0
date: '2025-11-09T12:04:46Z'
seo:
  description: >-
    Easy add structured logging, request tracking, and error monitoring to your
    oRPC powered by Pino The Rate Limit package provides flexible rate limiting
    for…
title: v1.11.0
type: changelog
---
### Pino Logging Integration [docs](https://orpc.dinwwwh.com/docs/integrations/pino)

Easy add structured logging, request tracking, and error monitoring to your oRPC powered by [Pino](https://getpino.io/)

```ts
const logger = pino()

const handler = new RPCHandler(router, {
  plugins: [
    new LoggingHandlerPlugin({
      logger, // Custom logger instance
      generateId: ({ request }) => crypto.randomUUID(), // Custom ID generator
      logRequestResponse: true, // Log request start/end (disabled by default)
      logRequestAbort: true, // Log when requests are aborted (disabled by default)
    }),
  ],
})
```

### Ratelimit Helpers [docs](https://orpc.dinwwwh.com/docs/helpers/ratelimit)

The Rate Limit package provides flexible rate limiting for oRPC with multiple storage backend support. It includes adapters for in-memory, Redis, and Upstash, along with middleware and plugin helpers for seamless integration.

#### Ratelimiter
```ts
const ratelimiter = new MemoryRatelimiter({
  maxRequests: 10,
  window: 60000,
})
```

#### Manually usage
```ts
const result = await limiter.limit('user:123')

if (!result.success) {
  throw new ORPCError('TOO_MANY_REQUESTS', {
    data: {
      limit: result.limit,
      remaining: result.remaining,
      reset: result.reset,
    },
  })
}
```

#### Built-in middleware
```ts
const loginProcedure = os
  .$context<{ ratelimiter: Ratelimiter }>()
  .input(z.object({ email: z.email() }))
  .use(
    createRatelimitMiddleware({
      limiter: ({ context }) => context.ratelimiter,
      key: ({ context }, input) => `login:${input.email}`,
    }),
  )
  .handler(({ input }) => {
    return { success: true }
  })


const result = await call(
  loginProcedure,
  { email: 'user@example.com' },
  { context: { ratelimiter } }
)
```

#### Response Header Plugin

```ts
import { RatelimitHandlerPlugin } from '@orpc/experimental-ratelimit'

const handler = new RPCHandler(router, {
  plugins: [
    new RatelimitHandlerPlugin(),
  ],
})
```

### Retry After Plugin [docs](https://orpc.dinwwwh.com/docs/plugins/retry-after)

The **Retry After Plugin** automatically retries requests based on server `Retry-After` headers. This is particularly useful for handling rate limiting and temporary server unavailability.

```ts
import { RetryAfterPlugin } from '@orpc/client/plugins'

const link = new RPCLink({
  url: 'http://localhost:3000/rpc',
  plugins: [
    new RetryAfterPlugin({
      condition: (response, options) => {
        // Override condition to determine if a request should be retried
        return response.status === 429 || response.status === 503
      },
      maxAttempts: 5, // Maximum retry attempts
      timeout: 5 * 60 * 1000, // Maximum time to spend retrying (ms)
    }),
  ],
})
```

### Expand support union/interaction in openapi generator

Now you can use `union/interaction` for define params, query, headers, ...

```ts
const procedure = os
   .route({ path: '/{type}' })
   .input(z.discriminatedUnion('type', [
      z.object({
        type: z.literal("a"),
        foo: z.number().int().positive(),
      }),
      z.object({
        type: z.literal("b"),
        foo: z.number().int().negative(),
      }),
    ]))
```

### &nbsp;&nbsp;&nbsp;🚀 Features

- **client**: Retry After Plugin &nbsp;-&nbsp; by @dinwwwh in https://github.com/middleapi/orpc/issues/1190 [<samp>(0ab5a)</samp>](https://github.com/middleapi/orpc/commit/0ab5adce)
- **openapi**: Expand support for unions/intersection of objects when generating OpenAPI specs &nbsp;-&nbsp; by @dinwwwh in https://github.com/middleapi/orpc/issues/1178 [<samp>(6424b)</samp>](https://github.com/middleapi/orpc/commit/6424b571)
- **pino**: Logging Plugin &nbsp;-&nbsp; by @dinwwwh in https://github.com/middleapi/orpc/issues/1191 [<samp>(4b03c)</samp>](https://github.com/middleapi/orpc/commit/4b03cd38)
- **server**: Ratelimit helpers & plugins &nbsp;-&nbsp; by @dinwwwh in https://github.com/middleapi/orpc/issues/1183 [<samp>(33122)</samp>](https://github.com/middleapi/orpc/commit/33122142)

> [!TIP]
> If you find oRPC valuable and would like to support its development, you can do so [here](https://github.com/sponsors/dinwwwh).

##### &nbsp;&nbsp;&nbsp;&nbsp;[View changes on GitHub](https://github.com/middleapi/orpc/compare/v1.10.4...v1.11.0)
