import { Observable } from "rxjs"; import { RPCProxy } from "./rpc-proxy"; export interface RemoteObservable { subscribe(observer: (t: T) => void): Promise; } export interface RemoteSubscription { unsubscribe(): Promise; } type ObservableType = T extends null | undefined ? T : T extends object & { subscribe(onfulfilled: infer F): any } ? F extends ((value: infer V, ...args: any) => any) ? V : never : T; export type MethodsOf = { [P in keyof T as T[P] extends ((...args) => Promise) ? P : never]: T[P] }; export type EventsOf = { [P in keyof T as T[P] extends Observable ? P : never]: RemoteObservable> }; export type Proxied = MethodsOf & EventsOf; export function markProxied(value: T | Proxied): Proxied { return > value; }