Aborting Procedure Calls
tRPC supports the standard AbortController/AbortSignal API for aborting procedures. All you have to do is pass an AbortSignal to the query or mutation options, and call the AbortController instance's abort method if you need to cancel the request.
utils.ts
import { function createTRPCClient<TRouter extends AnyRouter>(opts: CreateTRPCClientOptions<TRouter>): TRPCClient<TRouter>createTRPCClient, function httpBatchLink<TRouter extends AnyRouter>(opts: HTTPBatchLinkOptions<TRouter["_def"]["_config"]["$types"]>): TRPCLink<TRouter>httpBatchLink } from '@trpc/client';
import type { type AppRouter = Router<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: false;
}, DecorateCreateRouterOptions<{
userById: QueryProcedure<{
input: string;
output: {
id: string;
name: string;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>> & DecorateCreateRouterOptions<{
userById: QueryProcedure<{
input: string;
output: {
id: string;
name: string;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>
AppRouter } from './server';
const const client: TRPCClient<BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: false;
}, DecorateCreateRouterOptions<{
userById: QueryProcedure<{
input: string;
output: {
id: string;
name: string;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>>>
client = createTRPCClient<BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: false;
}, DecorateCreateRouterOptions<{
userById: QueryProcedure<{
input: string;
output: {
id: string;
name: string;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>>>(opts: CreateTRPCClientOptions<BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: false;
}, DecorateCreateRouterOptions<{
userById: QueryProcedure<{
input: string;
output: {
id: string;
name: string;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>>>): TRPCClient<...>
createTRPCClient<type AppRouter = Router<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: false;
}, DecorateCreateRouterOptions<{
userById: QueryProcedure<{
input: string;
output: {
id: string;
name: string;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>> & DecorateCreateRouterOptions<{
userById: QueryProcedure<{
input: string;
output: {
id: string;
name: string;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>
AppRouter>({
links: TRPCLink<BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: false;
}, DecorateCreateRouterOptions<{
userById: QueryProcedure<{
input: string;
output: {
id: string;
name: string;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>>>[]
links: [
httpBatchLink<BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: false;
}, DecorateCreateRouterOptions<{
userById: QueryProcedure<{
input: string;
output: {
id: string;
name: string;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>>>(opts: HTTPBatchLinkOptions<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: false;
}>): TRPCLink<BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: false;
}, DecorateCreateRouterOptions<...>>>
httpBatchLink({
url: string | URLurl: 'http://localhost:3000/trpc',
}),
],
});
// 1. Create an AbortController instance - this is a standard javascript API
const const ac: AbortControllerac = new var AbortController: new () => AbortControllerAbortController();
// 2. Pass the signal to a query or mutation
const const query: TRPCTaggedPromise<{
id: string;
name: string;
}, DefaultErrorShape>
query = const client: TRPCClient<BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: false;
}, DecorateCreateRouterOptions<{
userById: QueryProcedure<{
input: string;
output: {
id: string;
name: string;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>>>
client.userById: {
query: Resolver<{
input: string;
output: {
id: string;
name: string;
};
errorShape: DefaultErrorShape;
transformer: false;
}>;
}
userById.query: (input: string, opts?: TRPCProcedureOptions) => TRPCTaggedPromise<{
id: string;
name: string;
}, DefaultErrorShape>
query('id_bilbo', { TRPCProcedureOptions.signal?: AbortSignal | undefinedsignal: const ac: AbortControllerac.AbortController.signal: AbortSignalsignal });
// 3. Cancel the request if needed
const ac: AbortControllerac.AbortController.abort(reason?: any): voidabort();