r19
Version:
Simple remote procedure calls in TypeScript
34 lines (33 loc) • 1.73 kB
TypeScript
/// <reference types="node" />
import { Procedures, Procedure } from "../types";
export type RPCClient<TProcedures extends Procedures> = TransformProcedures<TProcedures>;
type TransformProcedures<TProcedures> = TProcedures extends Procedures ? {
[P in keyof TProcedures]: TransformProcedures<TProcedures[P]>;
} : TProcedures extends Procedure<any> ? TransformProcedure<TProcedures> : TProcedures;
type TransformProcedure<TProcedure extends Procedure<any>> = (...args: TransformProcedureArgs<Parameters<TProcedure>> extends any[] ? TransformProcedureArgs<Parameters<TProcedure>> : []) => Promise<TransformProcedureReturnType<Awaited<ReturnType<TProcedure>>>>;
type TransformProcedureArgs<TArgs extends any[]> = {
[P in keyof TArgs]: TransformProcedureArg<TArgs[P]>;
};
type TransformProcedureArg<TArg> = TArg extends Record<string, unknown> | unknown[] ? {
[P in keyof TArg]: TransformProcedureArg<TArg[P]>;
} : TArg extends Buffer ? Blob : TArg;
type TransformProcedureReturnType<TReturnType> = TReturnType extends Record<string, unknown> | unknown[] ? {
[P in keyof TReturnType]: TransformProcedureReturnType<TReturnType[P]>;
} : TReturnType extends Buffer ? Blob : TReturnType extends Error ? {
name: string;
message: string;
} : TReturnType;
export type ResponseLike = {
arrayBuffer: () => Promise<ArrayBuffer>;
};
export type FetchLike = (input: string, init: {
method: "POST";
body: any;
headers: Record<string, string>;
}) => Promise<ResponseLike>;
export type CreateRPCClientArgs = {
serverURL: string;
fetch?: FetchLike;
};
export declare const createRPCClient: <TProcedures extends Procedures>(args: CreateRPCClientArgs) => TransformProcedures<TProcedures>;
export {};