UNPKG

@camar/http

Version:

To use __superconductor__ you need to build sources by `yarn build`

45 lines (44 loc) 2.96 kB
/// <reference types="node" /> import { URL } from 'url'; import { IncomingHttpHeaders, OutgoingHttpHeaders } from 'http'; import * as http from 'http'; export declare type IResponse = { rawContent: string | Buffer; headers: OutgoingHttpHeaders; statusCode: number; statusMessage: string; }; export declare type RequestMethod = 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE' | 'HEAD'; export interface ILayer<TRequest extends IRequest<any, any>, TResponse extends IResponse, TContext> { route<LRequest extends TRequest, LResponse extends TResponse>(template: string, method?: RequestMethod): IController<LRequest, LResponse, TContext>; context<TNewContext>(resolver: ContextResolver<TContext, TNewContext>): ILayer<TRequest, TResponse, TNewContext>; middleware<MRequest extends IRequest<any, any> = TRequest, MResponse extends IResponse = TResponse>(middleware: Middleware<TContext, TRequest, TResponse, MRequest, MResponse>): ILayer<MRequest, MResponse, TContext>; } export declare type NextFunction<TRequest extends IRequest<any, any>, TResponse extends IResponse> = (request: TRequest) => Promise<TResponse>; export declare type Middleware<TContext, TRequest extends IRequest<any, any>, TResponse extends IResponse, MRequest extends IRequest<any, any> = TRequest, MResponse extends IResponse = TResponse> = (this: TContext, req: TRequest, next: NextFunction<MRequest, MResponse>, ctx: TContext) => Promise<TResponse>; export declare type ArbitraryRequestParams = { [index: string]: string; }; export declare type ArbitraryRequestQuery = { [index: string]: string | string[]; }; export declare type RouteHandler<TRequest extends IRequest<any, any>, TResponse extends IResponse, C> = (this: C, req: TRequest, ctx: C) => Promise<TResponse | void> | TResponse | void; export declare type BaseRequest<P extends ArbitraryRequestParams, Q extends ArbitraryRequestQuery> = { params: P; query: Q; headers: IncomingHttpHeaders; url: URL; }; export interface IRequest<P extends ArbitraryRequestParams, Q extends ArbitraryRequestQuery> extends BaseRequest<P, Q> { body: () => Promise<Buffer>; json: <T>() => Promise<T>; request: http.IncomingMessage; response: http.ServerResponse; } export interface IController<TRequest extends IRequest<any, any>, TResponse extends IResponse, TContext, TLocalContext = TContext> { handle(handler: RouteHandler<TRequest, TResponse, TLocalContext>): ILayer<TRequest, TResponse, TContext>; context<TNewContext>(resolver: ContextResolver<TLocalContext, TNewContext>): IController<TRequest, TResponse, TContext, TNewContext>; } export declare type SyncContextResolver<TOriginal, TNew> = (originalContext: TOriginal) => TNew; export declare type AsyncContextResolver<TOriginal, TNew> = (originalContext: TOriginal) => Promise<TNew>; export declare type ContextResolver<TOriginal, TNew> = SyncContextResolver<TOriginal, TNew> | AsyncContextResolver<TOriginal, TNew>;