@jsonjoy.com/reactive-rpc
Version:
Reactive-RPC is a library for building reactive APIs over WebSocket, HTTP, and other RPCs.
15 lines (14 loc) • 1.25 kB
TypeScript
import type { Observable } from 'rxjs';
import type { FunctionStreamingType, FunctionType, ResolveType } from '@jsonjoy.com/json-type';
import type { ObjectValue, ObjectValueToTypeMap, UnObjectType } from '@jsonjoy.com/json-type/lib/value/ObjectValue';
import type { TypeRouter } from '@jsonjoy.com/json-type/lib/system/TypeRouter';
import type { ObjectValueCaller } from './rpc/caller/ObjectValueCaller';
import type { RpcCaller } from './rpc/caller/RpcCaller';
import type { TypeRouterCaller } from './rpc/caller/TypeRouterCaller';
export type CallerToMethods<Caller extends RpcCaller<any>> = {
[K in keyof UnTypeRouter<UnTypeRouterCaller<Caller>>]: UnwrapFunction<UnTypeRouter<UnTypeRouterCaller<Caller>>[K]>;
};
type UnTypeRouterCaller<T> = T extends TypeRouterCaller<infer R> ? R : T extends ObjectValueCaller<infer R> ? R : never;
type UnTypeRouter<T> = T extends TypeRouter<infer R> ? R : T extends ObjectValue<infer R> ? ObjectValueToTypeMap<UnObjectType<R>> : never;
type UnwrapFunction<F> = F extends FunctionType<infer Req, infer Res> ? (req: ResolveType<Req>) => Promise<ResolveType<Res>> : F extends FunctionStreamingType<infer Req, infer Res> ? (req$: Observable<ResolveType<Req>>) => Observable<ResolveType<Res>> : never;
export {};