UNPKG

r19

Version:

Simple remote procedure calls in TypeScript

34 lines (33 loc) 1.73 kB
/// <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 {};