import { type Server as HTTPServer, IncomingMessage, ServerResponse } from 'http' import { type Server as HTTPSServer } from 'https' import { Pattern, Methods } from 'trouter' import { Http2SecureServer, Http2ServerRequest, Http2ServerResponse } from 'http2' export enum Protocol { HTTP = 'http', HTTPS = 'https', HTTP2 = 'http2' } export type Server

= P extends Protocol.HTTP2 ? Http2SecureServer : P extends Protocol.HTTPS ? HTTPSServer : HTTPServer export type StepFunction = (error?: unknown) => void export type Request

= P extends Protocol.HTTP2 ? Http2ServerRequest : IncomingMessage export type Response

= P extends Protocol.HTTP2 ? Http2ServerResponse : ServerResponse export type RequestHandler

= ( req: Request

, res: Response

, next: (error?: unknown) => void ) => void | Promise export interface IRouter

{ lookup: RequestHandler

use(...handlers: RequestHandler

[]): this use(router: IRouter

): this use(pattern: Pattern, ...handlers: RequestHandler

[]): this use(prefix: Pattern, router: IRouter

): this all(pattern: Pattern, ...handlers: RequestHandler

[]): this get(pattern: Pattern, ...handlers: RequestHandler

[]): this head(pattern: Pattern, ...handlers: RequestHandler

[]): this patch(pattern: Pattern, ...handlers: RequestHandler

[]): this options(pattern: Pattern, ...handlers: RequestHandler

[]): this connect(pattern: Pattern, ...handlers: RequestHandler

[]): this delete(pattern: Pattern, ...handlers: RequestHandler

[]): this trace(pattern: Pattern, ...handlers: RequestHandler

[]): this post(pattern: Pattern, ...handlers: RequestHandler

[]): this put(pattern: Pattern, ...handlers: RequestHandler

[]): this on(method: Methods, pattern: Pattern, ...middlewares: RequestHandler

[]): this }