switchLink
Pick one of several named chains per call, and let a call force one with a typed call option.
switchLink({ name, links, pick }) sends each call down one of several named branches. pick chooses the branch for a call, and name becomes a typed call option, so one call can override pick:
const const client: TrpcClient<{
report: Procedure<{
type: "query";
ctx: Context;
meta: {};
input: undefined;
output: {
views: number;
};
errors: never;
services: never;
}>;
}, {
transport?: "http" | "ws" | undefined;
}, undefined, LinksTypes<readonly [TrpcLink<SwitchLinkDecl<"transport", {
readonly http: TrpcLink<HttpLinkDecl<{
url: string;
batch: true;
}>, any>;
readonly ws: SocketLink<{
form: JsonForm;
}>;
}>, {
report: Procedure<{
type: "query";
ctx: Context;
meta: {};
input: undefined;
output: {
views: number;
};
errors: never;
services: never;
}>;
}>]>>
client = createTrpcClient<RouterType<{
report: Procedure<{
type: "query";
ctx: Context;
meta: {};
input: undefined;
output: {
views: number;
};
errors: never;
services: never;
}>;
}>, readonly [TrpcLink<SwitchLinkDecl<"transport", {
readonly http: TrpcLink<HttpLinkDecl<{
url: string;
batch: true;
}>, any>;
readonly ws: SocketLink<{
form: JsonForm;
}>;
}>, {
report: Procedure<{
type: "query";
ctx: Context;
meta: {};
input: undefined;
output: {
views: number;
};
errors: never;
services: never;
}>;
}>]>(opts: TypedClientOptions<...>): TrpcClient<...>
createTrpcClient({
TypedClientOptions<RouterType<{ report: Procedure<{ type: "query"; ctx: Context; meta: {}; input: undefined; output: { views: number; }; errors: never; services: never; }>; }>, readonly [...]>.router: RouterType<{
report: Procedure<{
type: "query";
ctx: Context;
meta: {};
input: undefined;
output: {
views: number;
};
errors: never;
services: never;
}>;
}>
router: routerType<{
report: Procedure<{
type: "query";
ctx: Context;
meta: {};
input: undefined;
output: {
views: number;
};
errors: never;
services: never;
}>;
}>(): RouterType<{
report: Procedure<{
type: "query";
ctx: Context;
meta: {};
input: undefined;
output: {
views: number;
};
errors: never;
services: never;
}>;
}>
routerType<type AppRouter = {
report: Procedure<{
type: "query";
ctx: Context;
meta: {};
input: undefined;
output: {
views: number;
};
errors: never;
services: never;
}>;
}
AppRouter>(),
TypedClientOptions<RouterType<{ report: Procedure<{ type: "query"; ctx: Context; meta: {}; input: undefined; output: { views: number; }; errors: never; services: never; }>; }>, readonly [...]>.links: readonly [TrpcLink<SwitchLinkDecl<"transport", {
readonly http: TrpcLink<HttpLinkDecl<{
url: string;
batch: true;
}>, any>;
readonly ws: SocketLink<{
form: JsonForm;
}>;
}>, {
report: Procedure<{
type: "query";
ctx: Context;
meta: {};
input: undefined;
output: {
views: number;
};
errors: never;
services: never;
}>;
}>]
links: [
switchLink<"transport", {
readonly http: TrpcLink<HttpLinkDecl<{
url: string;
batch: true;
}>, any>;
readonly ws: SocketLink<{
form: JsonForm;
}>;
}, {
report: Procedure<{
type: "query";
ctx: Context;
meta: {};
input: undefined;
output: {
views: number;
};
errors: never;
services: never;
}>;
}>(opts: SwitchLinkOptions<"transport", {
readonly http: TrpcLink<HttpLinkDecl<{
url: string;
batch: true;
}>, any>;
readonly ws: SocketLink<{
form: JsonForm;
}>;
}, {
report: Procedure<{
type: "query";
ctx: Context;
meta: {};
input: undefined;
output: {
views: number;
};
errors: never;
services: never;
}>;
}>): TrpcLink<...>
switchLink({
SwitchLinkOptions<"transport", { readonly http: TrpcLink<HttpLinkDecl<{ url: string; batch: true; }>, any>; readonly ws: SocketLink<{ form: JsonForm; }>; }, { report: Procedure<{ type: "query"; ctx: Context; meta: {}; input: undefined; output: { views: number; }; errors: never; services: never; }>; }>.name: "transport"name: 'transport',
SwitchLinkOptions<"transport", { readonly http: TrpcLink<HttpLinkDecl<{ url: string; batch: true; }>, any>; readonly ws: SocketLink<{ form: JsonForm; }>; }, { report: Procedure<{ type: "query"; ctx: Context; meta: {}; input: undefined; output: { views: number; }; errors: never; services: never; }>; }>.links: {
readonly http: TrpcLink<HttpLinkDecl<{
url: string;
batch: true;
}>, any>;
readonly ws: SocketLink<{
form: JsonForm;
}>;
}
links: {
http: TrpcLink<HttpLinkDecl<{
url: string;
batch: true;
}>, any>
http: httpLink<{
url: string;
batch: true;
}>(opts: {
url: string;
batch: true;
}): TrpcLink<HttpLinkDecl<{
url: string;
batch: true;
}>, any>
httpLink({ url: stringurl, batch: truebatch: true }),
ws: SocketLink<{
form: JsonForm;
}>
ws: wsLink<{
url: string;
}>(opts: {
url: string;
}): SocketLink<{
form: JsonForm;
}>
wsLink({ url: stringurl: const wsUrl: stringwsUrl }),
},
SwitchLinkOptions<"transport", { readonly http: TrpcLink<HttpLinkDecl<{ url: string; batch: true; }>, any>; readonly ws: SocketLink<{ form: JsonForm; }>; }, { report: Procedure<{ type: "query"; ctx: Context; meta: {}; input: undefined; output: { views: number; }; errors: never; services: never; }>; }>.pick: (op: Operation<{}> & {
readonly path: "report";
}) => "http" | "ws"
pick: (op: Operation<{}> & {
readonly path: "report";
}
op) => (op: Operation<{}> & {
readonly path: "report";
}
op.Operation<{}>.type: ProcedureTypetype === 'subscription' ? 'ws' : 'http'),
}),
],
});
await const client: TrpcClient<{
report: Procedure<{
type: "query";
ctx: Context;
meta: {};
input: undefined;
output: {
views: number;
};
errors: never;
services: never;
}>;
}, {
transport?: "http" | "ws" | undefined;
}, undefined, LinksTypes<readonly [TrpcLink<SwitchLinkDecl<"transport", {
readonly http: TrpcLink<HttpLinkDecl<{
url: string;
batch: true;
}>, any>;
readonly ws: SocketLink<{
form: JsonForm;
}>;
}>, {
report: Procedure<{
type: "query";
ctx: Context;
meta: {};
input: undefined;
output: {
views: number;
};
errors: never;
services: never;
}>;
}>]>>
client.report: {
query(input?: undefined, opts?: CallOptions<{
transport?: "http" | "ws" | undefined;
}> | undefined): TrpcPromise<{
views: number;
}, CallError<{
type: "query";
ctx: Context;
meta: {};
input: undefined;
output: {
views: number;
};
errors: never;
services: never;
}, JsonForm, never>>;
}
report.function query(input?: undefined, opts?: CallOptions<{
transport?: "http" | "ws" | undefined;
}> | undefined): TrpcPromise<{
views: number;
}, CallError<{
type: "query";
ctx: Context;
meta: {};
input: undefined;
output: {
views: number;
};
errors: never;
services: never;
}, JsonForm, never>>
query(const input: undefinedinput, { transport?: "http" | "ws" | undefinedtransport: 'http' });A branch can be a chain (an array of links), including another switchLink. On a client made with router:, pick sees typed paths.
The name can't be signal, lastEventId, init, headers or reconnect, and two switch links on one chain can't share a name; both are type errors and throw when the link is made.
Like splitLink, calls get the call options and errors of every branch's links (Custom links).