Tanstack Query Default Options docs
You can configure default options for all query/mutation utilities using experimental_defaults. These options are spread merged with user-provided options, allowing you to set defaults while still enabling customization on a per-call basis.
const orpc = createTanstackQueryUtils(client, {
experimental_defaults: {
planet: {
find: {
queryOptions: {
staleTime: 60 * 1000, // 1 minute
retry: 3,
},
},
list: {
infiniteOptions: {
staleTime: 30 * 1000,
},
},
create: {
mutationOptions: {
onSuccess: (output, input, _, ctx) => {
ctx.client.invalidateQueries({ queryKey: orpc.planet.key() })
},
},
},
},
},
})
// These will automatically use the default options
const query = useQuery(orpc.planet.find.queryOptions({ input: { id: 123 } }))
const mutation = useMutation(orpc.planet.create.mutationOptions())
// User-provided options override defaults
const customQuery = useQuery(orpc.planet.find.queryOptions({
input: { id: 123 },
staleTime: 0, // overrides the default
}))Cloudflare Durable Object Publisher Adapter docs
Building real-time features on Cloudflare Workers has never been easier, thanks to our publisher helpers:
import { DurablePublisher, PublisherDurableObject } from '@orpc/experimental-publisher-durable-object'
export class PublisherDO extends PublisherDurableObject {
constructor(ctx: DurableObjectState, env: Env) {
super(ctx, env, {
resume: {
retentionSeconds: 60 * 2, // Retain events for 2 minutes to support resume
},
})
}
}
export default {
async fetch(request, env) {
const publisher = new DurablePublisher<{
'something-updated': {
id: string
}
}>(env.PUBLISHER_DO, {
prefix: 'publisher1', // avoid conflict with other keys
customJsonSerializers: [] // optional custom serializers
})
},
}Note
Full example at Cloudflare Worker Playground
NestJS Integration Upgraded docs
NestJS Integration now supports oRPC plugins, custom error responses, custom send-response behavior, and global context type-safe.
declare module '@orpc/nest' {
/**
* Extend oRPC global context to make it type-safe inside your handlers/middlewares
*/
interface ORPCGlobalContext {
request: Request
}
}
@Module({
imports: [
ORPCModule.forRootAsync({ // or use .forRoot for static config
useFactory: (request: Request) => ({
interceptors: [
onError((error) => {
console.error(error)
}),
],
context: { request }, // oRPC context, accessible from middlewares, etc.
eventIteratorKeepAliveInterval: 5000, // 5 seconds
customJsonSerializers: [],
plugins: [
new SmartCoercionPlugin({
schemaConverters: [
new ZodToJsonSchemaConverter(),
],
}),
], // almost oRPC plugins are compatible
}),
inject: [REQUEST],
}),
],
controllers: [AuthController, PlanetController, ReferenceController, OtherController],
providers: [PlanetService, ReferenceService],
})🚀 Features
- nest: Custom send response, global context, plugins, custom error response - by @unnoq in #1256 (56695)
- publisher: Cloudflare durable object adapter - by @unnoq in #1253 (e565e)
- tanstack-query: Default query/mutation options - by @unnoq in #1260 (1fe44)
🐞 Bug Fixes
Tip
If you find oRPC valuable and would like to support its development, you can do so here.