import { Server as HttpServer, IncomingMessage, ServerResponse } from 'http' import { Server as HttpsServer } from 'https' import { Http2SecureServer, Http2ServerRequest, Http2ServerResponse } from 'http2' declare namespace restana { enum Protocol { HTTP = 'http', HTTPS = 'https', HTTP2 = 'http2' } // https://github.com/microsoft/TypeScript/issues/1897#issuecomment-580962081 type Body = | null | boolean | number | string | Buffer | Body[] | { [prop: string]: Body } enum Method { GET = 'get', DELETE = 'delete', PATCH = 'patch', POST = 'post', PUT = 'put', HEAD = 'head', OPTIONS = 'options', TRACE = 'trace' } interface RequestExtensions { params: Record query: Record originalUrl: string, body?: Body } type Request

= P extends Protocol.HTTP2 ? Http2ServerRequest & RequestExtensions : IncomingMessage & RequestExtensions interface ResponseExtensions { send( data?: unknown, code?: number, headers?: Record, cb?: () => void ): void } interface Router

{ get: RegisterRoute

delete: RegisterRoute

patch: RegisterRoute

post: RegisterRoute

put: RegisterRoute

head: RegisterRoute

options: RegisterRoute

trace: RegisterRoute

all: RegisterRoute

} type Response

= P extends Protocol.HTTP2 ? Http2ServerResponse & ResponseExtensions : ServerResponse & ResponseExtensions type Server

= P extends Protocol.HTTP2 ? Http2SecureServer : P extends Protocol.HTTPS ? HttpsServer : HttpServer type RequestHandler

= ( req: Request

, res: Response

, next: (error?: unknown) => void ) => void | Promise type ErrorHandler

= ( err: Error, req: Request

, res: Response

, ) => void | Promise interface RegisterRoute

{ ( path: string | string[], ...middlewares: RequestHandler

[] ): Service

} interface Options

{ server?: Server

prioRequestsProcessing?: boolean routerCacheSize?: number defaultRoute?: RequestHandler

errorHandler?: ErrorHandler

} interface Service

extends Router

{ routes(): string[], getRouter(): Router

, newRouter(): Router

errorHandler: ErrorHandler

, getServer(): Server

, getConfigOptions(): Options

use(middleware: RequestHandler

): restana.Service

use(prefix: string, middleware: RequestHandler

): restana.Service

use(prefix: string, middleware: Router

): restana.Service

handle(req: Request

, res: Response

): void start(port?: number, host?: string): Promise> close(): Promise } } declare function restana

( options?: restana.Options

): restana.Service

export = restana