UNPKG

@whatwg-node/server

Version:

Fetch API compliant HTTP Server adapter

53 lines (52 loc) 3.75 kB
/// <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 };