import { Observable } from 'rxjs';
import { RPCData } from './rpc-call';
import { IRPCDefinition } from './rpc-definition';
import { RPCMethod } from './rpc-method-decorator';
export declare type RPCPeerType<TLocalDefinition extends IRPCDefinition> = {
    [TName in TLocalDefinition['name']]: RPCMethod<Extract<TLocalDefinition, {
        name: TName;
    }>>;
};
export interface IRPCAdapter {
    incoming$: Observable<RPCData>;
    connect$: Observable<void>;
    send(outgoing: RPCData): Promise<void>;
}
export declare class RPCPeer<TRemoteDefinition extends IRPCDefinition = IRPCDefinition> {
    private adapter;
    private requestHandlersMap;
    private incomingSubscription;
    constructor(adapter: IRPCAdapter);
    call<TName extends TRemoteDefinition['name']>(name: TName, ...args: Extract<TRemoteDefinition, {
        name: TName;
    }>['args']): Promise<Extract<TRemoteDefinition, {
        name: TName;
    }>['return']>;
    dispose(): void;
    private onIncoming;
    private handleRequest;
    private _handleRequest;
    private handleResponse;
    private callLocalMethod;
}
