import { WsConnect, WsMessage, WsClose, HttpRequest } from "../types/external";
import { LocalContext, GlobalContext } from "../types/context";
import { RealAny, EndFn, AnyClass } from "../types/internal";
export declare const currentVersion = 3;
export interface MiddlewareData<Config extends Record<any, any>, Context extends Record<any, any>, HTTPContext extends AnyClass, WSConnectContext extends AnyClass, WSMessageContext extends AnyClass, WSCloseContext extends AnyClass> {
    /** The Code to run when the Middleware gets loaded */ initEvent?(localContext: Context, config: Config, ctg: GlobalContext): RealAny;
    /** The Code to run when an HTTP Request Triggers */ httpEvent?(localContext: Context, end: EndFn, ctr: HttpRequest, ctx: LocalContext, ctg: GlobalContext): RealAny;
    /** The Code to run when a WebSocket Connects */ wsConnectEvent?(localContext: Context, end: EndFn, ctr: WsConnect, ctx: LocalContext, ctg: GlobalContext): RealAny;
    /** The Code to run when a WebSocket Recieves a Message */ wsMessageEvent?(localContext: Context, end: EndFn, ctr: WsMessage, ctx: LocalContext, ctg: GlobalContext): RealAny;
    /** The Code to run when a WebSocket Closes */ wsCloseEvent?(localContext: Context, end: EndFn, ctr: WsClose, ctx: LocalContext, ctg: GlobalContext): RealAny;
    /** Class Modifications */ classModifications: {
        http: HTTPContext;
        wsConnect: WSConnectContext;
        wsMessage: WSMessageContext;
        wsClose: WSCloseContext;
    };
}
declare class Dummy {
}
export declare class MiddlewareLoader<Config extends Record<any, any>, Context extends Record<any, any>, HTTPContext extends AnyClass, WSConnectContext extends AnyClass, WSMessageContext extends AnyClass, WSCloseContext extends AnyClass> {
    protected context: Context;
    protected data: MiddlewareData<Config, Context, HTTPContext, WSConnectContext, WSMessageContext, WSCloseContext>;
    constructor(data: MiddlewareData<Config, Context, HTTPContext, WSConnectContext, WSMessageContext, WSCloseContext>, context: Context);
    /**
     * Configure the Middleware
     * @since 7.0.0
     * @from rjweb-server
    */ config(config: Config): {
        /** The Internal Data of the Middleware */ data: MiddlewareData<Config, Context, HTTPContext, WSConnectContext, WSMessageContext, WSCloseContext>;
        /** The Provided Config to the Middleware */ config: Config;
        /** The Version of the Middleware Builder */ version: number;
        /** The Internal Context of the Middleware */ localContext: Context;
    };
}
/**
 * A Utility used for constructing middlewares
 * @example
 * ```
 * const middleware = new MiddlewareBuilder(...).build()
 * ```
 * @since 7.0.0
*/ export default class MiddlewareBuilder<Config extends Record<any, any> = {}, Context extends Record<any, any> = {}, HTTPContext extends AnyClass = typeof Dummy, WSConnectContext extends AnyClass = typeof Dummy, WSMessageContext extends AnyClass = typeof Dummy, WSCloseContext extends AnyClass = typeof Dummy> {
    private data;
    private dataContext;
    protected version: number;
    /**
     * Set the default Context State
     * @since 7.0.0
    */ context(
    /** The Initial Context */ context: Context): this;
    /**
     * Set the extended Class for the HTTP Context
     * @example
     * ```
     * const middleware = new MiddlewareBuilder()
     *   .httpClass((Expand) => class extends Expand {
     *     printHi() {
     *       this.print('Hi')
     *     }
     *   })
     *   .build()
     * ```
     * @since 7.0.0
    */ httpClass<Class extends AnyClass>(
    /** The Callback to the Class extending the HTTP Class */ callback: (extend: typeof HttpRequest, localContext: Context) => Class): MiddlewareBuilder<Config, Context, Class, WSConnectContext, WSMessageContext, WSCloseContext>;
    /**
     * Set the extended Class for the WebSocket Connect Context
     * @example
     * ```
     * const middleware = new MiddlewareBuilder()
     *   .wsConnectClass((Expand) => class extends Expand {
     *     printHi() {
     *       this.print('Hi')
     *     }
     *   })
     *   .build()
     * ```
     * @since 7.0.0
    */ wsConnectClass<Class extends AnyClass>(
    /** The Callback to the Class extending the HTTP Class */ callback: (extend: typeof WsConnect, localContext: Context) => Class): MiddlewareBuilder<Config, Context, HTTPContext, Class, WSMessageContext, WSCloseContext>;
    /**
     * Set the extended Class for the WebSocket Message Context
     * @example
     * ```
     * const middleware = new MiddlewareBuilder()
     *   .wsMessageClass((Expand) => class extends Expand {
     *     printHi() {
     *       this.print('Hi')
     *     }
     *   })
     *   .build()
     * ```
     * @since 7.0.0
    */ wsMessageClass<Class extends AnyClass>(
    /** The Callback to the Class extending the HTTP Class */ callback: (extend: typeof WsMessage, localContext: Context) => Class): MiddlewareBuilder<Config, Context, HTTPContext, WSConnectContext, Class, WSCloseContext>;
    /**
     * Set the extended Class for the WebSocket Close Context
     * @example
     * ```
     * const middleware = new MiddlewareBuilder()
     *   .wsCloseClass((Expand) => class extends Expand {
     *     logBye() {
     *       console.log('Bye,', this.client.ip)
     *     }
     *   })
     *   .build()
     * ```
     * @since 7.0.0
    */ wsCloseClass<Class extends AnyClass>(
    /** The Callback to the Class extending the HTTP Class */ callback: (extend: typeof WsClose, localContext: Context) => Class): MiddlewareBuilder<Config, Context, HTTPContext, WSConnectContext, WSMessageContext, Class>;
    /**
     * Add a Callback for when the Middleware gets loaded
     * @since 5.7.0
    */ init(
    /** The Function to Call on a HTTP Request */ callback: MiddlewareData<Config, Context, HTTPContext, WSConnectContext, WSMessageContext, WSCloseContext>['initEvent']): this;
    /**
     * Add a Callback for HTTP Requests
     * @since 5.7.0
    */ http(
    /** The Function to Call on a HTTP Request */ callback: MiddlewareData<Config, Context, HTTPContext, WSConnectContext, WSMessageContext, WSCloseContext>['httpEvent']): this;
    /**
     * Add a Callback for WebSocket Connections
     * @since 5.7.0
    */ wsConnect(
    /** The Function to Call on a WebSocket Connection */ callback: MiddlewareData<Config, Context, HTTPContext, WSConnectContext, WSMessageContext, WSCloseContext>['wsConnectEvent']): this;
    /**
     * Add a Callback for WebSocket Messages
     * @since 5.7.0
    */ wsMessage(
    /** The Function to Call on a WebSocket Message */ callback: MiddlewareData<Config, Context, HTTPContext, WSConnectContext, WSMessageContext, WSCloseContext>['wsMessageEvent']): this;
    /**
     * Add a Callback for Closing WebSockets
     * @since 5.7.0
    */ wsClose(
    /** The Function to Call on a Closed WebSocket */ callback: MiddlewareData<Config, Context, HTTPContext, WSConnectContext, WSMessageContext, WSCloseContext>['wsCloseEvent']): this;
    /**
     * Get the Production Version of this Class (required to load)
     * @since 5.7.0
    */ build(): MiddlewareLoader<Config, Context, HTTPContext, WSConnectContext, WSMessageContext, WSCloseContext>;
}
export {};
