/// <reference types="node" />
import { Server as HttpServer, RequestListener as HttpRequestListener } from "http";
import { Socket } from "net";
import { Stats as FsStats } from "fs";
import { Defaults } from "./Handlers/Defaults";
import { Register } from "./Applications/Register";
import { ErrorsHandler } from "./Handlers/Error";
import { FilesHandler } from "./Handlers/File";
import { DirectoriesHandler } from "./Handlers/Directory";
import { Event } from "./Event";
import { Request } from "./Request";
import { Response } from "./Response";
export * from "./Request";
export * from "./Response";
export * from "./Event";
export * from "./Tools/Namespace";
export * from "./Applications/IApplication";
import { Session as _Session } from "./Applications/Session";
export declare class Session extends _Session {
}
import { INamespace as _INamespace } from "./Applications/Sessions/INamespace";
export declare namespace Session {
    interface INamespace extends _INamespace {
    }
}
export declare class Server {
    static readonly VERSION: string;
    static readonly STATES: {
        CLOSED: number;
        STARTING: number;
        CLOSING: number;
        STARTED: number;
    };
    static DEFAULTS: {
        PORT: number;
        DOMAIN: string;
        RESPONSES: typeof Defaults;
    };
    protected state: number;
    protected documentRoot?: string;
    protected basePath?: string;
    protected port?: number;
    protected hostName?: string;
    protected development: boolean;
    protected indexes: {
        scripts: string[];
        files: string[];
    };
    protected httpServer?: HttpServer;
    protected netSockets?: Set<Socket>;
    protected customServerHandler?: HttpRequestListener;
    protected register?: Register;
    protected errorsHandler?: ErrorsHandler;
    protected filesHandler?: FilesHandler;
    protected directoriesHandler?: DirectoriesHandler;
    protected customErrorHandler?: (err: Error, code?: number, req?: Request, res?: Response) => Promise<void>;
    protected customHttpPreHandlers: ((req: Request, res: Response, event?: Event) => Promise<void>)[];
    protected forbiddenPaths: (string | RegExp)[];
    /**
     * @summary Create new server instance (no singleton implementation).
     */
    static CreateNew(): Server;
    /**
     * @summary Set development mode, `true` by default. If `true`, directories contents and errors are displayed, `false` otherwise.
     * @param development If `true`, directories contents and errors are displayed, `false` otherwise.
     */
    SetDevelopment(development: boolean): Server;
    /**
     * @summary Set http server IP or domain to listening on, `127.0.0.1` by default.
     * @param hostname Server ip or domain to listening on.
     */
    SetHostname(hostname: string): Server;
    /**
     * @summary Set http server port number, `8000` by default.
     * @param port Server port to listening on.
     */
    SetPort(port: number): Server;
    /**
     * @summary Set http server root directory, required
     * @param dirname Server root directory as absolute path.
     */
    SetDocumentRoot(dirname: string): Server;
    /**
     * @summary Set http server base path, not required
     * @param basePath Base path (proxy path, if you are running the server under proxy).
     */
    SetBasePath(basePath: string): Server;
    /**
     * @summary Set custom http server handler like express module.
     * @see https://stackoverflow.com/a/17697134/7032987
     * @param httpHandler
     */
    SetServerHandler(httpHandler: HttpRequestListener): Server;
    /**
     * @summary Set custom error handler for uncatched errors and warnings
     * @param errorHandler Custom handler called on any uncatched error.
     */
    SetErrorHandler(errorHandler: (err: Error, code?: number, req?: Request, res?: Response) => Promise<void>): Server;
    /**
     * Set forbidden request paths to prevent requesting dangerous places (`["/node_modules", /\/package\.json/g, /\/tsconfig\.json/g, /\/\.([^\.]+)/g]` by default). All previous configuration will be overwritten.
     * @param forbiddenPaths Forbidden request path begins or regular expression patterns.
     */
    SetForbiddenPaths(forbiddenPaths: (string | RegExp)[]): Server;
    /**
     * Add forbidden request paths to prevent requesting dangerous places (`["/node_modules", /\/package\.json/g, /\/tsconfig\.json/g, /\/\.([^\.]+)/g]` by default).
     * @param forbiddenPaths Forbidden request path begins or regular expression patterns.
     */
    AddForbiddenPaths(forbiddenPaths: (string | RegExp)[]): Server;
    /**
     * Set directory index/default server script file names executed on server side as directory content.
     * All previous configuration will be replaced.
     * Default value is: `['index.js']`.
     * @param indexScripts Array of file names like `['index.js', 'default.js', 'app.js', ...]`.
     */
    SetIndexScripts(indexScripts: string[]): Server;
    /**
     * Add directory index/default server script file names executed on server side as directory content.
     * Default value is: `['index.js']`.
     * @param indexScripts Array of file names like `['default.js', 'app.js', ...]`.
     */
    AddIndexScripts(indexScripts: string[]): Server;
    /**
     * Set directory index/default server file names staticly send to client as default directory content.
     * All previous configuration will be replaced.
     * Default value is: `['index.html','index.htm','default.html','default.htm']`.
     * @param indexFiles Array of file names like `['index.html','index.htm','default.html','default.htm', 'directory.html', ...]`.
     */
    SetIndexFiles(indexFiles: string[]): Server;
    /**
     * Add directory index/default server file names staticly send to client as default directory content.
     * Default value is: `['index.html','index.htm','default.html','default.htm']`.
     * @param indexFiles Array of file names like `['directory.html', 'directory.htm', ...]`.
     */
    AddIndexFiles(indexFiles: string[]): Server;
    /**
     * @summary Add custom express http handler
     * @param handler Custom http request handler called every allowed request path before standard server handling.
     */
    AddPreHandler(handler: (req: Request, res: Response, event?: Event) => Promise<void>): Server;
    /**
     * @summary Return `true` if development flag is used.
     */
    IsDevelopment(): boolean;
    /**
     * @summary Return configured domain or ip address.
     */
    GetHostname(): string;
    /**
     * @summary Return configured port number.
     */
    GetPort(): number;
    /**
     * @summary Return configured document root directory full path.
     */
    GetDocumentRoot(): string;
    /**
     * @summary Return configured base url.
     */
    GetBasePath(): string;
    /**
     * @summary Return configured custom errors handler.
     */
    GetErrorHandler(): ((err: Error, code: number, req?: Request, res?: Response) => Promise<void>) | null;
    /**
     * Get forbidden request paths to prevent requesting dangerous places.
     */
    GetForbiddenPaths(): (string | RegExp)[];
    /**
     * Get directory index/default server script file names executed on server side as directory content.
     * Default value is: `['index.js']`.
     */
    GetIndexScripts(): string[];
    /**
     * Get directory index/default server file names staticly send to client as default directory content.
     * Default value is: `['index.html','index.htm','default.html','default.htm']`.
     */
    GetIndexFiles(): string[];
    /**
     * @summary Return used http server instance.
     */
    GetHttpServer(): HttpServer | null;
    /**
     * @summary Return set of connected sockets.
     */
    GetNetSockets(): Set<Socket>;
    /**
     * @summary Return server running state (`Server.STATES.<state>`).
     */
    GetState(): number;
    /**
     * @summary Try to find cached record by server document root and requested path
     * 			and return directory full path from the cache record.
     * @param rawRequestUrl Raw requested path.
     */
    TryToFindIndexPath(rawRequestUrl: string): string[] | null;
    /**
     * @summary Start HTTP server
     */
    Start(callback?: (success?: boolean, error?: Error) => void): Server;
    /**
     * @summary Close all registered app instances, close and destroy all connected sockets and stop http server.
     * @param callback
     */
    Stop(callback?: (success?: boolean, error?: Error) => void): Server;
    /**
     * @summary Handle all HTTP requests
     */
    protected handleReq(req: Request, res: Response): Promise<void>;
    /**
     * @summary Close all registered app instances, close and destroy all connected sockets and stop http server.
     * @param callback
     */
    protected stopHandler(callback?: (success?: boolean, error?: Error) => void): void;
    /**
     * Get if path is allowed by `this.forbiddenPaths` configuration.
     * @param path Path including start slash, excluding base url and excluding params.
     */
    protected isPathAllowed(path: string): boolean;
    /**
     * @summary Process request content found
     */
    protected handleReqExistingPath(fullPath: string, requestPath: string, stats: FsStats, req: Request, res: Response): void;
    /**
     * @summary Display error 500/404 (and try to list first existing parent folder content):
     */
    protected handleReqNonExistingPath(requestPath: string, req: Request, res: Response): void;
    /**
     * @summary Try to get file system directory stats - recursively on first existing parent directory.
     */
    protected handleReqNonExistPath(pathsToFound: string[], index: number, successCallback: (newFullPath: string, newRequestPath: string, dirStats: FsStats) => void, errorCallback: (err: Error) => void): void;
    protected getSearchingRequestPaths(requestPath: string): string[];
}
