/**
 * Handles attaching transport
 */
import { EventEmitter } from 'events';
import Transport from '../transport/base';
import { AtomicResult } from '../types';
import { ILogger } from '../utils/logger';
import { Buffer } from './Buffer';
import { Neovim } from './Neovim';
import { Tabpage } from './Tabpage';
import { Window } from './Window';
export type Callback = (err?: Error | null, res?: any) => void;
export declare class AsyncResponse {
    readonly requestId: number;
    private cb;
    private finished;
    constructor(requestId: number, cb: Callback);
    finish(err?: string | null, res?: any): void;
}
export interface NeovimClient extends Neovim, EventEmitter {
}
export declare class NeovimClient extends Neovim {
    private logger;
    readonly isVim: boolean;
    private _isReady;
    private requestId;
    private responses;
    private _channelId;
    private attachedBuffers;
    private _transport;
    constructor(logger: ILogger, isVim: boolean);
    get transport(): Transport;
    echoError(msg: unknown): void;
    logError(msg: string, ...args: any[]): void;
    createBuffer(id: number): Buffer;
    createWindow(id: number): Window;
    createTabpage(id: number): Tabpage;
    /**
     * Invoke redraw on vim, must called when screen need update.
     */
    redrawVim(force?: boolean): void;
    /** Attaches msgpack to read/write streams * */
    attach({ reader, writer, }: {
        reader: NodeJS.ReadableStream;
        writer: NodeJS.WritableStream;
    }, requestApi?: boolean): void;
    detach(): void;
    get channelId(): Promise<number>;
    private handleRequest;
    sendAsyncRequest(method: string, args: any[]): Promise<any>;
    private handleNotification;
    requestApi(): Promise<any[]>;
    private generateApi;
    attachBufferEvent(bufnr: number, eventName: string, cb: Function): void;
    /**
     * Returns `true` if buffer should be detached
     */
    detachBufferEvent(bufnr: number, eventName: string, cb: Function): void;
    pauseNotification(): void;
    resumeNotification(redrawVim?: boolean): Promise<AtomicResult>;
    resumeNotification(redrawVim: boolean, notify: true): null;
    /**
     * @deprecated
     */
    hasFunction(name: string): boolean;
}
