Skip to content

tRPC Adapter

VeloxTS uses tRPC under the hood for type-safe procedure calls. This page covers tRPC-specific configuration.

tRPC is automatically configured when you register procedures:

import { veloxApp } from '@veloxts/velox';
import { userProcedures } from './procedures/users';
const app = veloxApp();
app.procedures(userProcedures);
app.start({ port: 3030 });
// tRPC available at /trpc

By default, tRPC is exposed at /trpc:

POST /trpc/users.listUsers
POST /trpc/users.getUser
POST /trpc/users.createUser
import { createTRPCClient, httpBatchLink } from '@trpc/client';
import type { AppRouter } from '../server/router';
export const trpc = createTRPCClient<AppRouter>({
links: [
httpBatchLink({
url: 'http://localhost:3030/trpc',
}),
],
});
// Usage
const users = await trpc.users.listUsers.query();
const user = await trpc.users.getUser.query({ id: '123' });
await trpc.users.createUser.mutate({ name: 'Alice', email: 'alice@example.com' });

VeloxTS provides utilities to convert procedure collections to tRPC routers:

src/router.ts
import { trpc, buildTRPCRouter } from '@veloxts/router';
import { userProcedures } from './procedures/users';
import { postProcedures } from './procedures/posts';
// Create tRPC instance
const t = trpc();
// Build routers from procedure collections
const userRouter = buildTRPCRouter(t, userProcedures);
const postRouter = buildTRPCRouter(t, postProcedures);
// Combine into app router
export const appRouter = t.router({
users: userRouter,
posts: postRouter,
});
export type AppRouter = typeof appRouter;

Change the tRPC endpoint path:

import { registerTRPCPlugin } from '@veloxts/router';
app.register(registerTRPCPlugin, {
prefix: '/api/trpc', // Now at /api/trpc instead of /trpc
});

tRPC automatically batches multiple queries:

// These are batched into a single HTTP request
const [users, posts] = await Promise.all([
trpc.users.listUsers.query(),
trpc.posts.listPosts.query(),
]);

tRPC errors are automatically formatted:

try {
await trpc.users.getUser.query({ id: 'invalid' });
} catch (error) {
if (error.data?.code === 'NOT_FOUND') {
// Handle not found
}
}
FeaturetRPCREST
Type safetyFull inferenceManual typing
BatchingAutomaticManual
CachingReact QueryHTTP cache
External clientsTypeScript onlyAny language
OpenAPI docsNoYes