@jsonjoy.com/reactive-rpc
Version:
Reactive-RPC is a library for building reactive APIs over WebSocket, HTTP, and other RPCs.
18 lines (17 loc) • 1.17 kB
TypeScript
import type { Observable } from 'rxjs';
export interface RpcClient {
call$(method: string, data: unknown | Observable<unknown>): Observable<unknown>;
call(method: string, request: unknown): Promise<unknown>;
notify(method: string, data: undefined | unknown): void;
}
type TypedRpcClientFn<Request, Response> = (req: Request) => Promise<Response>;
type TypedRpcClientFn$<Request, Response> = (req: Observable<Request>) => Observable<Response>;
type UnPromise<T> = T extends Promise<infer U> ? U : T;
type UnObservable<T> = T extends Observable<infer U> ? U : T;
type UnwrapResponse<T> = UnPromise<UnObservable<T>>;
export interface TypedRpcClient<Routes extends Record<string, TypedRpcClientFn<any, any> | TypedRpcClientFn$<any, any>>> extends RpcClient {
call$<K extends keyof Routes>(method: K, data: Parameters<Routes[K]>[0] | UnObservable<Parameters<Routes[K]>[0]>): Observable<UnwrapResponse<ReturnType<Routes[K]>>>;
call<K extends keyof Routes>(method: K, data: Parameters<Routes[K]>[0]): Promise<UnwrapResponse<ReturnType<Routes[K]>>>;
notify<K extends keyof Routes>(method: K, data: UnObservable<Parameters<Routes[K]>[0]>): void;
}
export {};