import { IdType, KeyType } from './common';
import { Messenger } from './messenger';
import { ConcreteEmitter } from './emitter';
import { MessageType, CallMessage, EventMessage, ResponseMessage, CallbackMessage, HandshakeResponseMessage, HandshakeRequestMessage } from './messages';
export declare type DispatcherEvents = {
    [x: string]: CallMessage<any[]> | EventMessage<any> | CallbackMessage<any[]> | ResponseMessage<any>;
    [MessageType.Call]: CallMessage<any[]>;
    [MessageType.Event]: EventMessage<any>;
};
export declare class Dispatcher extends ConcreteEmitter<DispatcherEvents> {
    private messenger;
    private sessionId;
    private removeMessengerListener;
    private uniqueId;
    constructor(messenger: Messenger, sessionId: IdType);
    private messengerListener;
    callOnRemote(methodName: KeyType, args: any[], transfer?: Transferable[]): {
        callbackEvent: string;
        responseEvent: string;
    };
    respondToRemote(requestId: IdType, value: any, error: any, transfer?: Transferable[]): void;
    callbackToRemote(requestId: IdType, callbackId: IdType, args: any[]): void;
    emitToRemote(eventName: KeyType, payload: any, transfer?: Transferable[]): void;
    close(): void;
}
export declare type ParentHandshakeDispatcherEvents = {
    [x: number]: HandshakeResponseMessage;
};
export declare class ParentHandshakeDispatcher extends ConcreteEmitter<ParentHandshakeDispatcherEvents> {
    private messenger;
    private sessionId;
    private removeMessengerListener;
    constructor(messenger: Messenger, sessionId: IdType);
    private messengerListener;
    initiateHandshake(): IdType;
    close(): void;
}
export declare type ChildHandshakeDispatcherEvents = {
    [MessageType.HandshakeRequest]: HandshakeRequestMessage;
};
export declare class ChildHandshakeDispatcher extends ConcreteEmitter<ChildHandshakeDispatcherEvents> {
    private messenger;
    private removeMessengerListener;
    constructor(messenger: Messenger);
    private messengerListener;
    acceptHandshake(sessionId: IdType): void;
    close(): void;
}
