import { AnyClass, EndFn, RealAny } from "../types/internal";
import HttpRequestContext from "./request/HttpRequestContext";
import WsOpenContext from "./request/WsOpenContext";
import WsMessageContext from "./request/WsMessageContext";
import WsCloseContext from "./request/WsCloseContext";
import Server from "./Server";
import RequestContext from "../types/internal/classes/RequestContext";
import GlobalContext from "../types/internal/classes/GlobalContext";
import Base from "./request/Base";
export type UsableMiddleware<Config extends Record<any, any> = any, ModifiedHttpContext extends AnyClass = any, ModifiedWsOpenContext extends AnyClass = any, ModifiedWsMessageContext extends AnyClass = any, ModifiedWsCloseContext extends AnyClass = any> = {
    NOTICE: 'DO NOT CALL MANUALLY, THIS IS FOR RJWEB INTERNALLY';
    classContexts: {
        HttpRequest(config: Config, Original: typeof HttpRequestContext): ModifiedHttpContext;
        WsOpen(config: Config, Original: typeof WsOpenContext): ModifiedWsOpenContext;
        WsMessage(config: Config, Original: typeof WsMessageContext): ModifiedWsMessageContext;
        WsClose(config: Config, Original: typeof WsCloseContext): ModifiedWsCloseContext;
    };
    infos: {
        name: string;
        version: string;
    };
    rjwebVersion: number;
    config: Config;
    callbacks: {
        load?(config: Config, server: Server<{}, [], {}>, context: GlobalContext): RealAny;
        httpRequest?(config: Config, server: Server<{}, [], {}>, context: RequestContext, ctr: HttpRequestContext & InstanceType<ModifiedHttpContext>, end: EndFn): RealAny;
        wsOpen?(config: Config, server: Server<{}, [], {}>, context: RequestContext, ctr: WsOpenContext & InstanceType<ModifiedWsOpenContext>, end: EndFn): RealAny;
        wsMessage?(config: Config, server: Server<{}, [], {}>, context: RequestContext, ctr: WsMessageContext & InstanceType<ModifiedWsMessageContext>, end: EndFn): RealAny;
        wsClose?(config: Config, server: Server<{}, [], {}>, context: RequestContext, ctr: WsCloseContext & InstanceType<ModifiedWsCloseContext>, end: EndFn): RealAny;
    };
    finishCallbacks: {
        httpRequest?(config: Config, server: Server<{}, [], {}>, context: RequestContext, ctr: Base, ms: number): RealAny;
        wsOpen?(config: Config, server: Server<{}, [], {}>, context: RequestContext, ctr: Base, ms: number): RealAny;
        wsMessage?(config: Config, server: Server<{}, [], {}>, context: RequestContext, ctr: Base, ms: number): RealAny;
        wsClose?(config: Config, server: Server<{}, [], {}>, context: RequestContext, ctr: Base, ms: number): RealAny;
    };
};
export declare const currentVersion = 9;
declare class Dummy {
}
export default class Middleware<Config extends Record<any, any> = {}, InternalData extends Record<any, any> = {}, ModifiedHttpContext extends AnyClass = typeof Dummy, ModifiedWsOpenContext extends AnyClass = typeof Dummy, ModifiedWsMessageContext extends AnyClass = typeof Dummy, ModifiedWsCloseContext extends AnyClass = typeof Dummy, Excluded extends (keyof Middleware)[] = []> {
    private name;
    private version;
    private data;
    /**
     * Build a new Middleware
     * @example
     * ```
     * import { Middleware } from "rjweb-server"
     *
     * const middleware = new Middleware<{ greeting: string }>('Say Hi', '1.0.0')
     *   .httpRequest((config, server, context, ctr, end) => {
     *     if (ctr.url.path.includes('hello')) end(ctr.print(config.greeting))
     *   })
     *   .export()
     * ```
     * @since 9.0.0
    */ constructor(name: string, version: string);
    /**
     * Callback that runs when the middleware is loaded (server starting, can be multiple times!)
     * @since 9.0.0
    */ load(callback: (config: Config, server: Server<{}, [], {}>, context: GlobalContext) => RealAny): Omit<Middleware<Config, InternalData, ModifiedHttpContext, ModifiedWsOpenContext, ModifiedWsMessageContext, ModifiedWsCloseContext, [...Excluded, 'load']>, Excluded[number] | 'load'>;
    /**
     * Callback that runs when any HTTP Request is made
     * @since 9.0.0
    */ httpRequest(callback: (config: Config, server: Server<{}, [], {}>, context: RequestContext<InternalData>, ctr: HttpRequestContext & InstanceType<ModifiedHttpContext>, end: EndFn) => RealAny): Omit<Middleware<Config, InternalData, ModifiedHttpContext, ModifiedWsOpenContext, ModifiedWsMessageContext, ModifiedWsCloseContext, [...Excluded, 'httpRequest']>, Excluded[number] | 'httpRequest'>;
    /**
     * Callback that runs when any HTTP Request finishes
     * @since 9.0.0
    */ httpRequestFinish(callback: (config: Config, server: Server<{}, [], {}>, context: RequestContext<InternalData>, ctr: Base, ms: number) => RealAny): Omit<Middleware<Config, InternalData, ModifiedHttpContext, ModifiedWsOpenContext, ModifiedWsMessageContext, ModifiedWsCloseContext, [...Excluded, 'httpRequestFinish']>, Excluded[number] | 'httpRequestFinish'>;
    /**
     * Modify the HttpRequestContext Class to add new properties or methods for the user
     * @since 9.0.0
    */ httpRequestContext<NewClass extends AnyClass>(callback: (config: Config, Original: typeof HttpRequestContext) => NewClass): Omit<Middleware<Config, InternalData, NewClass, ModifiedWsOpenContext, ModifiedWsMessageContext, ModifiedWsCloseContext, [...Excluded, 'httpRequestContext']>, Excluded[number] | 'httpRequestContext'>;
    /**
     * Callback that runs when any WebSocket Connection is opened
     * @since 9.0.0
    */ wsOpen(callback: (config: Config, server: Server<{}, [], {}>, context: RequestContext<InternalData>, ctr: WsOpenContext & InstanceType<ModifiedWsOpenContext>, end: EndFn) => RealAny): Omit<Middleware<Config, InternalData, ModifiedHttpContext, ModifiedWsOpenContext, ModifiedWsMessageContext, ModifiedWsCloseContext, [...Excluded, 'wsOpen']>, Excluded[number] | 'wsOpen'>;
    /**
     * Callback that runs when any WebSocket Connection is opened and finishes running all events
     * @since 9.0.0
    */ wsOpenFinish(callback: (config: Config, server: Server<{}, [], {}>, context: RequestContext<InternalData>, ctr: Base, ms: number) => RealAny): Omit<Middleware<Config, InternalData, ModifiedHttpContext, ModifiedWsOpenContext, ModifiedWsMessageContext, ModifiedWsCloseContext, [...Excluded, 'wsOpenFinish']>, Excluded[number] | 'wsOpenFinish'>;
    /**
     * Modify the WsOpenContext Class to add new properties or methods for the user
     * @since 9.0.0
    */ wsOpenContext<NewClass extends AnyClass>(callback: (config: Config, Original: typeof WsOpenContext) => NewClass): Omit<Middleware<Config, InternalData, ModifiedHttpContext, NewClass, ModifiedWsMessageContext, ModifiedWsCloseContext, [...Excluded, 'wsOpenContext']>, Excluded[number] | 'wsOpenContext'>;
    /**
     * Callback that runs when any WebSocket Message is recieved
     * @since 9.0.0
    */ wsMessage(callback: (config: Config, server: Server<{}, [], {}>, context: RequestContext<InternalData>, ctr: WsMessageContext & InstanceType<ModifiedWsMessageContext>, end: EndFn) => RealAny): Omit<Middleware<Config, InternalData, ModifiedHttpContext, ModifiedWsOpenContext, ModifiedWsMessageContext, ModifiedWsCloseContext, [...Excluded, 'wsMessage']>, Excluded[number] | 'wsMessage'>;
    /**
     * Callback that runs when any WebSocket Message is recieved and finishes running all events
     * @since 9.0.0
    */ wsMessageFinish(callback: (config: Config, server: Server<{}, [], {}>, context: RequestContext<InternalData>, ctr: Base, ms: number) => RealAny): Omit<Middleware<Config, InternalData, ModifiedHttpContext, ModifiedWsOpenContext, ModifiedWsMessageContext, ModifiedWsCloseContext, [...Excluded, 'wsMessageFinish']>, Excluded[number] | 'wsMessageFinish'>;
    /**
     * Modify the WsMessageContext Class to add new properties or methods for the user
     * @since 9.0.0
    */ wsMessageContext<NewClass extends AnyClass>(callback: (config: Config, Original: typeof WsMessageContext) => NewClass): Omit<Middleware<Config, InternalData, ModifiedHttpContext, ModifiedWsOpenContext, NewClass, ModifiedWsCloseContext, [...Excluded, 'wsMessageContext']>, Excluded[number] | 'wsMessageContext'>;
    /**
     * Callback that runs when any WebSocket Connection is closed
     * @since 9.0.0
    */ wsClose(callback: (config: Config, server: Server<{}, [], {}>, context: RequestContext<InternalData>, ctr: WsCloseContext & InstanceType<ModifiedWsCloseContext>, end: EndFn) => RealAny): Omit<Middleware<Config, InternalData, ModifiedHttpContext, ModifiedWsOpenContext, ModifiedWsMessageContext, ModifiedWsCloseContext, [...Excluded, 'wsClose']>, Excluded[number] | 'wsClose'>;
    /**
     * Callback that runs when any WebSocket Connection is closed and finishes running all events
     * @since 9.0.0
    */ wsCloseFinish(callback: (config: Config, server: Server<{}, [], {}>, context: RequestContext<InternalData>, ctr: Base, ms: number) => RealAny): Omit<Middleware<Config, InternalData, ModifiedHttpContext, ModifiedWsOpenContext, ModifiedWsMessageContext, ModifiedWsCloseContext, [...Excluded, 'wsCloseFinish']>, Excluded[number] | 'wsCloseFinish'>;
    /**
     * Modify the WsCloseContext Class to add new properties or methods for the user
     * @since 9.0.0
    */ wsCloseContext<NewClass extends AnyClass>(callback: (config: Config, Original: typeof WsCloseContext) => NewClass): Omit<Middleware<Config, InternalData, ModifiedHttpContext, ModifiedWsOpenContext, ModifiedWsMessageContext, NewClass, [...Excluded, 'wsCloseContext']>, Excluded[number] | 'wsCloseContext'>;
    /**
     * Export the Middleware for use in the Server
     * @since 9.0.0
    */ export(): {
        use(config: Config): UsableMiddleware<Config, ModifiedHttpContext, ModifiedWsOpenContext, ModifiedWsMessageContext, ModifiedWsCloseContext>;
    };
}
export {};
