UNPKG

@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
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 {};