/// <reference path="../../localtypings/pxteditor.d.ts" />
declare type MessageHandler = (response: any) => void;
interface PendingMessage {
    original: pxt.editor.EditorMessageRequest;
    resolve: MessageHandler;
    reject: MessageHandler;
}
/**
 * Abstract class for driving communication with an embedded iframe
 */
export declare abstract class IframeDriver {
    iframe: HTMLIFrameElement;
    protected readyForMessages: boolean;
    protected messageQueue: pxt.editor.EditorMessageRequest[];
    protected nextId: number;
    protected pendingMessages: {
        [index: string]: PendingMessage;
    };
    protected editorEventListeners: {
        [index: string]: MessageHandler[];
    };
    protected port: MessagePort;
    protected portRequestPending: boolean;
    protected frameId: string;
    constructor(iframe: HTMLIFrameElement);
    protected abstract handleMessage(message: MessageEvent): void;
    dispose(): void;
    addEventListener(event: string, handler: (ev: any) => void): void;
    removeEventListener(event: string, handler: (ev: any) => void): void;
    protected onMessageReceived: (event: MessageEvent) => void;
    protected resolvePendingMessage(event: MessageEvent): void;
    protected fireEvent(event: string, data: any): void;
    protected sendRequest(message: any): Promise<unknown>;
    protected sendMessageCore(message?: any): void;
    protected createMessagePort(): void;
}
export {};
