@whatwg-node/server
Version:
Fetch API compliant HTTP Server adapter
53 lines (52 loc) • 3.75 kB
TypeScript
/// <reference types="node" />
/// <reference lib="webworker" />
import type { RequestListener, ServerResponse } from 'node:http';
import { NodeRequest } from './utils';
export interface ServerAdapterBaseObject<TServerContext, THandleRequest extends ServerAdapterRequestHandler<TServerContext> = ServerAdapterRequestHandler<TServerContext>> {
/**
* An async function that takes `Request` and the server context and returns a `Response`.
* If you use `requestListener`, the server context is `{ req: IncomingMessage, res: ServerResponse }`.
*/
handle: THandleRequest;
}
export interface ServerAdapterObject<TServerContext, TBaseObject extends ServerAdapterBaseObject<TServerContext, ServerAdapterRequestHandler<TServerContext>>> extends EventListenerObject {
/**
* A basic request listener that takes a `Request` with the server context and returns a `Response`.
*/
handleRequest: TBaseObject['handle'];
/**
* WHATWG Fetch spec compliant `fetch` function that can be used for testing purposes.
*/
fetch(request: Request, ctx: TServerContext): Promise<Response> | Response;
fetch(request: Request, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
fetch(urlStr: string, ctx: TServerContext): Promise<Response> | Response;
fetch(urlStr: string, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
fetch(urlStr: string, init: RequestInit, ctx: TServerContext): Promise<Response> | Response;
fetch(urlStr: string, init: RequestInit, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
fetch(url: URL, ctx: TServerContext): Promise<Response> | Response;
fetch(url: URL, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
fetch(url: URL, init: RequestInit, ctx: TServerContext): Promise<Response> | Response;
fetch(url: URL, init: RequestInit, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
/**
* This function takes Node's request object and returns a WHATWG Fetch spec compliant `Response` object.
**/
handleNodeRequest(nodeRequest: NodeRequest, ctx: TServerContext): Promise<Response> | Response;
/**
* A request listener function that can be used with any Node server variation.
*/
requestListener: RequestListener;
/**
* Proxy to requestListener to mimic Node middlewares
*/
handle: ServerAdapterObject<TServerContext, TBaseObject>['requestListener'] & ServerAdapterObject<TServerContext, TBaseObject>['fetch'];
}
export declare type ServerAdapter<TServerContext, TBaseObject extends ServerAdapterBaseObject<TServerContext>> = TBaseObject & ServerAdapterObject<TServerContext, TBaseObject>['requestListener'] & ServerAdapterObject<TServerContext, TBaseObject>['fetch'] & ServerAdapterObject<TServerContext, TBaseObject>;
export declare type ServerAdapterRequestHandler<TServerContext> = (request: Request, ctx: TServerContext) => Promise<Response> | Response;
export declare type DefaultServerAdapterContext = {
req: NodeRequest;
res: ServerResponse;
waitUntil(promise: Promise<unknown>): void;
};
declare function createServerAdapter<TServerContext = DefaultServerAdapterContext, THandleRequest extends ServerAdapterRequestHandler<TServerContext> = ServerAdapterRequestHandler<TServerContext>>(serverAdapterRequestHandler: THandleRequest, RequestCtor?: typeof Request): ServerAdapter<TServerContext, ServerAdapterBaseObject<TServerContext, THandleRequest>>;
declare function createServerAdapter<TServerContext, TBaseObject extends ServerAdapterBaseObject<TServerContext>>(serverAdapterBaseObject: TBaseObject, RequestCtor?: typeof Request): ServerAdapter<TServerContext, TBaseObject>;
export { createServerAdapter };