import { Token, Type, AsyncHandler } from '@tsdi/ioc';
import { HandleType, IHandle } from '@tsdi/boot';
import { IContext } from '../IContext';
import { IConfiguration } from '../IConfiguration';
import { MvcContext } from '../MvcContext';
/**
 * middleware func.
 *
 * @export
 * @interface MiddlewareFunc
 * @extends {Function}
 * @template T
 */
export interface MiddlewareFunc extends AsyncHandler<IContext> {
    /**
     * middleware name.
     *
     * @type {string}
     * @memberof MiddlewareFunc
     */
    middleName?: string;
}
/**
 * middlware check.
 *
 * @export
 * @template T
 * @param {*} target
 * @returns {target is MiddlewareFunc}
 */
export declare function isMiddlewareFunc(target: any): target is MiddlewareFunc;
/**
 * bind middleware name.
 *
 * @export
 * @param {Function} middleware
 * @param {string} name
 * @returns {MiddlewareFunc}
 */
export declare function bindMiddlewareName(middleware: Function, name: string): MiddlewareFunc;
/**
 * Middleware inteface
 * @export
 * @interface IMiddleware
 */
export interface IMiddleware extends IHandle<IContext> {
    /**
    * execute handle.
    *
    * @param {T} ctx
    * @param {() => Promise<void>} next
    * @returns {Promise<void>}
    * @memberof IHandle
    */
    execute(ctx: IContext, next: () => Promise<void>): Promise<void>;
}
/**
 * middleware class.
 *
 * @export
 * @interface MiddlewareClass
 * @extends {Type<T>}
 * @template T
 */
export interface MiddlewareClass<T extends IMiddleware> extends Type<T>, MiddlewareFunc {
}
/**
 * default middleware types.
 *
 * @export
 * @enum {number}
 */
export declare enum MiddlewareTypes {
    Helmet = "helmet",
    BodyParser = "bodyParser",
    Cors = "Cors",
    Csrf = "Csrf",
    Json = "json",
    Logger = "logger",
    Session = "session",
    Content = "content",
    View = "view",
    Router = "router"
}
/**
 * middleware type.
 */
export declare type MiddlewareType = Token<IMiddleware> | HandleType<IContext> | MiddlewareFunc;
/**
 * middleware factory.
 */
export declare type MvcMiddlewareType = Type<IMiddleware> | IMiddleware | ((config?: IConfiguration, ctx?: MvcContext) => MiddlewareFunc | AsyncHandler<IContext> | void);
