/// import * as http from 'http'; import { OneOrMore } from '../models/Generics'; import ServerManager from '../methods/servermanager'; import { Invokable } from '../models/Invokable'; export interface CraydentHttp extends http.Server { routes: Route[]; /** * @deprecated Load balancing should be done by the infrastructure */ loadBalance: (ips: string | string[]) => void; // #region all overloads all( config: { path: T; callback: RequestHandler; readonly parameters?: P; } ): void; all( path: T, callback: RequestHandler, parameters?: P ): void; // all( // configOrPath: T | { // path: T; // callback: RequestHandler; // readonly parameters?: P; // }, // callback?: RequestHandler, // parameters?: P // ): void; // #endregion // #region delete overloads delete( config: { path: T; callback: RequestHandler; readonly parameters?: P; } ): void; delete( path: T, callback: RequestHandler, parameters?: P ): void; // delete( // configOrPath: T | { // path: T; // callback: RequestHandler; // readonly parameters?: P; // }, // callback?: RequestHandler, // parameters?: Parameter[] // ): void; // #endregion // #region get overloads get( config: { path: T; callback: RequestHandler; readonly parameters?: P; } ): void; get( path: T, callback: RequestHandler ): void; // get( // configOrPath: T | { // path: T; // callback: RequestHandler; // readonly parameters?: P; // }, // callback?: RequestHandler // ): void; // #endregion // #region patch overloads patch( config: { path: T; callback: RequestHandler; readonly parameters?: P; } ): void; patch( path: T, callback: RequestHandler, parameters?: P ): void; // patch( // configOrPath: T | { // path: T; // callback: RequestHandler; // readonly parameters?: P; // }, // callback?: RequestHandler, // parameters?: P // ): void; // #endregion // #region post overloads post( config: { path: T; callback: RequestHandler; readonly parameters?: P; } ): void; post( path: T, callback: RequestHandler, parameters?: P ): void; // post( // configOrPath: T | { // path: T; // callback: RequestHandler; // readonly parameters?: P; // }, // callback?: RequestHandler, // parameters?: P // ): void; // #endregion // #region put overloads put( config: { path: T; callback: RequestHandler; readonly parameters?: P; } ): void; put( path: T, callback: RequestHandler, parameters?: P ): void; // put( // configOrPath: T | { // path: T; // callback: RequestHandler; // readonly parameters?: P; // }, // callback?: RequestHandler, // parameters?: P // ): void; // #endregion // #region use overloads use( path: T, callback: RequestHandler ): void | ((this: CraydentHttp, callback: OneOrMore) => void); use( callback: RequestHandler ): void | ((this: CraydentHttp, callback: OneOrMore) => void); // #endregion } export interface Route { path: T; callback: RequestHandler[]; method: 'all' | 'delete' | 'get' | 'middleware' | 'patch' | 'post' | 'put'; parameters?: P; } export interface Parameter { name: string; type?: 'array' | 'bool' | 'boolean' | 'date' | 'email' | 'int' | 'number' | 'object' | 'regexp' | 'string'; required?: boolean; default?: any; } type ParameterTypeMap = { string: string; email: string; object: { [key: string]: any } number: number; int: number; bool: boolean; boolean: boolean; array: any[]; date: Date; regexp: RegExp; }; type ParameterToType

= P['type'] extends keyof ParameterTypeMap ? P['required'] extends true ? ParameterTypeMap[P['type']] // Required field : ParameterTypeMap[P['type']] | undefined // Optional field : any; type MapParameters = { [P in Params[number]as P['name']]: ParameterToType

; }; export type ExtractParams = T extends `${infer _Start}\${${infer Param}}${infer Rest}` ? { [K in Param | keyof ExtractParams]: string } : {}; export type RequestHandlerParams< T extends string, P extends readonly Parameter[], Request extends typeof http.IncomingMessage, Response extends typeof http.ServerResponse> = { request: InstanceType; response: InstanceType & { req: InstanceType }; value?: ExtractParams & MapParameters

; next?: Invokable; }; export type RequestHandler< T extends string = string, P extends readonly Parameter[] = readonly Parameter[], Request extends typeof http.IncomingMessage = typeof http.IncomingMessage, Response extends typeof http.ServerResponse = typeof http.ServerResponse > = (this: ServerManager, params: RequestHandlerParams) => any | Promise | GeneratorFunction | AsyncGeneratorFunction;