@quiltjs/quilt
Version:
Lightweight, type-safe handler and router abstraction for Node HTTP servers.
59 lines • 3.49 kB
TypeScript
/// <reference types="node" resolution-mode="require"/>
import { type IncomingMessage, type ServerResponse } from 'node:http';
import type { HttpContext, ServerEngineAdapter } from '../Quilt.js';
import { type Handler, type HandlerOutputs } from '../Handler.js';
export type NodeHttpRequest = IncomingMessage & {
params: Record<string, string | undefined>;
query: Record<string, string | undefined>;
body: unknown;
/**
* Optional per-request metadata bag.
*
* This is an escape hatch intended for infrastructure concerns like
* logging and tracing (for example, attaching a requestId). Business
* data should generally flow through handlers and their dependencies
* instead of being stored here.
*/
locals?: Record<string, unknown>;
};
type NodeHttpRouteHandler = (req: NodeHttpRequest, res: ServerResponse) => Promise<void>;
/**
* Minimal adapter that implements the ServerEngineAdapter interface using
* Node's built-in `http` module.
*
* It provides basic routing with support for:
* - Static paths, e.g. `/status`
* - Parameterized paths, e.g. `/users/:id/orders/:orderId`
* - JSON request bodies (when `content-type` includes `application/json`)
*/
export declare class NodeHttpEngineAdapter implements ServerEngineAdapter<NodeHttpRequest, ServerResponse> {
private routes;
private server;
private port;
get(path: string, handler: NodeHttpRouteHandler): void;
post(path: string, handler: NodeHttpRouteHandler): void;
put(path: string, handler: NodeHttpRouteHandler): void;
patch(path: string, handler: NodeHttpRouteHandler): void;
delete(path: string, handler: NodeHttpRouteHandler): void;
options(path: string, handler: NodeHttpRouteHandler): void;
head(path: string, handler: NodeHttpRouteHandler): void;
listen(port: number, callback?: () => void): void;
getPort(): number | undefined;
close(): Promise<void>;
private findRoute;
private matchPath;
private readBody;
}
export type NodeHttpContext = HttpContext<NodeHttpRequest, ServerResponse>;
export type NodeHttpHandlerContext<Params extends Record<string, string | undefined> = Record<string, string | undefined>, Query extends Record<string, string | undefined> = Record<string, string | undefined>, Body = any> = HttpContext<NodeHttpRequest & {
params: Params;
query: Query;
body: Body;
}, ServerResponse>;
export type NodeHttpHandler<O = any, Params extends Record<string, string | undefined> = Record<string, string | undefined>, Query extends Record<string, string | undefined> = Record<string, string | undefined>, Body = any, D extends Record<string, Handler<any, NodeHttpHandlerContext<Params, Query, Body>, any>> = Record<string, Handler<any, NodeHttpHandlerContext<Params, Query, Body>, any>>> = Handler<O, NodeHttpHandlerContext<Params, Query, Body>, D>;
export declare function createNodeHttpRouteHandler<O = any, Params extends Record<string, string | undefined> = Record<string, string | undefined>, Query extends Record<string, string | undefined> = Record<string, string | undefined>, Body = any, D extends Record<string, Handler<any, NodeHttpContext, any>> = Record<string, Handler<any, NodeHttpContext, any>>>({ execute, dependencies, }: {
execute: (ctx: NodeHttpHandlerContext<Params, Query, Body>, deps: HandlerOutputs<D>) => Promise<O> | O;
dependencies?: D;
}): Handler<O, NodeHttpContext, D>;
export {};
//# sourceMappingURL=NodeHttpEngineAdapter.d.ts.map