import { EventEmitter } from "events";
import { Callback } from "../common/callbackUtil";
import { DispatchService } from "./dispatchService";
import { Logger } from "../nullLogger";
import { RequestContext } from "../operationContext";
/**
 * Responsible for dispatching service requests.
 *
 * <uml>
 *  hide members
 *  hide circle
 *  DispatcherFactory .> RequestDispatcher
 *  EventEmitter <|.. RequestDispatcher
 *  RequestDispatcher *-- DispatchService : services
 *  RequestDispatcher *- Logger : logger
 * </uml>
 *
 * ### Events
 * * `closing` - Triggered when [[close]] is called on the RequestDispatcher. This event indicates that the dispatcher is
 * no longer accepting new requests.
 * * `closed` - Triggered after the RequestedDispatched closes. This event indicates that all pending requests have
 * completed or timed out.
 * * `error` - Trigger if an unhandled exception is raised in an operation. This event is only relevant if an
 * [[OperationContext]] is created.
 *
 */
export declare class RequestDispatcher extends EventEmitter {
    /**
     * Timeout in milliseconds for close operation to complete. Any requests that have not completed before
     * the timeout are aborted.
     */
    closeTimeout: number;
    /**
     * List of services in the dispatcher.
     */
    services: DispatchService[];
    /**
     * Logger to use that conforms to [bunyan](https://www.npmjs.com/package/bunyan)'s logger interface.
     */
    logger: Logger;
    /**
     * @hidden
     */
    private _head;
    /**
     * @hidden
     */
    private _tail;
    /**
     * @hidden
     */
    private _requestCount;
    /**
     * @hidden
     */
    private _closing;
    /**
     * @hidden
     */
    private _closed;
    /**
     * @hidden
     */
    private _closeTimer;
    /**
     * Dispatches a request.
     * @param request The request to dispatch.
     */
    dispatch(request: RequestContext): void;
    /**
     * Validates that the dispatcher is correctly configured.
     */
    validate(): void;
    /**
     * Closes the dispatcher. If any requests do not complete within 'closeTimeout', they are aborted.
     * @param callback Optional. Called after dispatcher is closed.
     */
    close(callback?: Callback): void;
    /**
     * Chooses the appropriate endpoint for the request.
     * @param message The request message.
     * @hidden
     */
    private _chooseEndpoint(message);
    /**
     * Adds a request to the list of pending requests.
     * @param handler The request handler.
     * @hidden
     */
    private _addRequest(handler);
    /**
     * Removes a request from the list of pending requests.
     * @param handler The request handler.
     * @hidden
     */
    private _removeRequest(handler);
}
