/// <reference types="node" />
declare type EventListener = (obj: any) => void;
declare type ErrorListener = (err: any) => void;
declare type ExitListener = (code: number | null) => void;
declare type CloseListener = (code: number | null, signal: NodeJS.Signals | null) => void;
export interface Server {
    /** Returns the response (or event) with the matching `request_seq`. */
    message(request: any): Promise<any>;
    /**
     * Sends an exit message to the server and forcibly kills it if it hasn't exited after `timeoutMs`.
     * Throws if the request fails (e.g. if the server has already exited).
     * Throws if the server doesn't exit before `timeoutMs` and it cannot be killed.
     * Returns true if the server exited before `timeoutMs` and false if it was killed.
     */
    exitOrKill(timoutMs: number): Promise<boolean>;
    /** Kills the server, regardless of its current state. */
    kill(): Promise<void>;
    /** Fires when an event is received from the server. */
    on(event: "event", listener: EventListener): void;
    /** Fires when an internal error occurs in the harness (not for language service errors). */
    on(event: "communicationError", listener: ErrorListener): void;
    /** Fires when the server exits. */
    on(event: "exit", listener: ExitListener): void;
    /** Fires when the server closes (exits + closes IO streams). */
    on(event: "close", listener: CloseListener): void;
    /** The PID of the subprocess. */
    pid?: number;
}
/**
 * Forks a new server process.  By default, the server will not have ATA or produce diagnostic events.
 */
export declare function launchServer(tsserverPath: string, args?: string[], execArgv?: string[], env?: NodeJS.ProcessEnv): Server;
export {};
