import { Module, ObjectTS } from "@intuitionrobotics/ts-common";
import { ApiResponse, HttpRequestData, ServerApi } from "./server-api";
import { ApiException } from "../../exceptions";
import { Express, ExpressRequest, ExpressRequestHandler } from "../../utils/types";
type ConfigType = {
    port: number;
    baseUrl: string;
    cors: {
        origins?: string[];
        methods?: string[];
        headers: string[];
        exposedHeaders?: string[];
    };
    ssl: {
        key: string;
        cert: string;
    };
    bodyParserLimit: number | string;
};
export type HttpErrorHandler = (requestData: HttpRequestData, error: ApiException) => Promise<string>;
export type ServerApi_Middleware = (request: ExpressRequest, data: HttpRequestData, response: ApiResponse, scopes: string[]) => Promise<ObjectTS | void>;
type HttpRoute = {
    methods: string[];
    path: string;
};
export declare class HttpServer_Class extends Module<ConfigType> {
    private static readonly expressMiddleware;
    private readonly express;
    private routes;
    constructor(_express: Express, configElement: ConfigType);
    static addMiddleware(middleware: ExpressRequestHandler): typeof HttpServer_Class;
    getRoutes(): HttpRoute[];
    getBaseUrl(): string;
    init(): void;
    printRoutes(prefix: string): void;
    resolveApi(routeResolver: RouteResolver, urlPrefix: string, apis: ServerApi<any>[]): void;
}
export declare class RouteResolver {
    readonly require: NodeRequire;
    readonly rootDir: string;
    readonly apiFolder: string;
    private middlewares;
    constructor(require: NodeRequire, rootDir: string, apiFolder?: string);
    setMiddlewares(...middlewares: ServerApi_Middleware[]): this;
    resolveApi(urlPrefix: string, baseUrl: string, _exp: Express): void;
    private resolveApiImpl;
    routeApis(apis: ServerApi<any>[], urlPrefix: string, baseUrl: string, _exp: Express): void;
}
export declare class HeaderKey {
    private readonly key;
    private readonly responseCode;
    constructor(key: string, responseCode?: number);
    get(request: ExpressRequest): string;
}
export {};
