@camar/http
Version:
To use __superconductor__ you need to build sources by `yarn build`
45 lines (44 loc) • 2.96 kB
TypeScript
/// <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>;