UNPKG

14.7 kBTypeScriptView Raw
1import { IncomingMessage, ServerResponse, OutgoingMessage } from 'node:http';
2export { IncomingMessage as NodeIncomingMessage, ServerResponse as NodeServerResponse } from 'node:http';
3import { CookieSerializeOptions } from 'cookie-es';
4import * as ufo from 'ufo';
5
6declare type HTTPMethod = "GET" | "HEAD" | "PATCH" | "POST" | "PUT" | "DELETE" | "CONNECT" | "OPTIONS" | "TRACE";
7declare type Encoding = false | "ascii" | "utf8" | "utf-8" | "utf16le" | "ucs2" | "ucs-2" | "base64" | "latin1" | "binary" | "hex";
8interface H3EventContext extends Record<string, any> {
9}
10declare type EventHandlerResponse<T = any> = T | Promise<T>;
11interface EventHandler<T = any> {
12 "__is_handler__"?: true;
13 (event: H3Event): EventHandlerResponse<T>;
14}
15declare type LazyEventHandler = () => EventHandler | Promise<EventHandler>;
16declare type RequestHeaders = {
17 [name: string]: string | undefined;
18};
19
20declare type NodeListener = (req: IncomingMessage, res: ServerResponse) => void;
21declare type NodePromisifiedHandler = (req: IncomingMessage, res: ServerResponse) => Promise<any>;
22declare type NodeMiddleware = (req: IncomingMessage, res: ServerResponse, next: (err?: Error) => any) => any;
23declare const defineNodeListener: (handler: NodeListener) => NodeListener;
24declare const defineNodeMiddleware: (middleware: NodeMiddleware) => NodeMiddleware;
25declare function fromNodeMiddleware(handler: NodeListener | NodeMiddleware): EventHandler;
26declare function toNodeListener(app: App): NodeListener;
27declare function promisifyNodeListener(handler: NodeListener | NodeMiddleware): NodePromisifiedHandler;
28declare function callNodeListener(handler: NodeMiddleware, req: IncomingMessage, res: ServerResponse): Promise<unknown>;
29
30declare class H3Headers implements Headers {
31 _headers: Record<string, string>;
32 constructor(init?: HeadersInit);
33 [Symbol.iterator](): IterableIterator<[string, string]>;
34 entries(): IterableIterator<[string, string]>;
35 keys(): IterableIterator<string>;
36 values(): IterableIterator<string>;
37 append(name: string, value: string): void;
38 delete(name: string): void;
39 get(name: string): string | null;
40 has(name: string): boolean;
41 set(name: string, value: string): void;
42 forEach(callbackfn: (value: string, key: string, parent: Headers) => void): void;
43}
44
45declare class H3Response implements Response {
46 readonly headers: H3Headers;
47 readonly status: number;
48 readonly statusText: string;
49 readonly redirected: boolean;
50 readonly ok: boolean;
51 readonly url: string;
52 _body: string | ArrayBuffer | Uint8Array;
53 readonly body: ReadableStream<Uint8Array> | null;
54 readonly type: ResponseType;
55 readonly bodyUsed = false;
56 constructor(body?: BodyInit | EventHandlerResponse | null, init?: ResponseInit);
57 clone(): H3Response;
58 arrayBuffer(): Promise<ArrayBuffer>;
59 blob(): Promise<Blob>;
60 formData(): Promise<FormData>;
61 json<T = any>(): Promise<T>;
62 text(): Promise<string>;
63}
64
65interface NodeEventContext {
66 req: IncomingMessage;
67 res: ServerResponse;
68}
69declare class H3Event implements Pick<FetchEvent, "respondWith"> {
70 "__is_event__": boolean;
71 node: NodeEventContext;
72 context: H3EventContext;
73 constructor(req: IncomingMessage, res: ServerResponse);
74 get path(): string | undefined;
75 /** @deprecated Please use `event.node.res` instead. **/
76 get req(): IncomingMessage;
77 /** @deprecated Please use `event.node.res` instead. **/
78 get res(): ServerResponse<IncomingMessage>;
79 respondWith(r: H3Response | PromiseLike<H3Response>): void;
80}
81declare function isEvent(input: any): input is H3Event;
82declare function createEvent(req: IncomingMessage, res: ServerResponse): H3Event;
83
84declare function defineEventHandler<T = any>(handler: EventHandler<T>): EventHandler<T>;
85declare const eventHandler: typeof defineEventHandler;
86declare function isEventHandler(input: any): input is EventHandler;
87declare function toEventHandler(input: any, _?: any, _route?: string): EventHandler;
88interface DynamicEventHandler extends EventHandler {
89 set: (handler: EventHandler) => void;
90}
91declare function dynamicEventHandler(initial?: EventHandler): DynamicEventHandler;
92declare function defineLazyEventHandler(factory: LazyEventHandler): EventHandler;
93declare const lazyEventHandler: typeof defineLazyEventHandler;
94
95interface Layer {
96 route: string;
97 match?: Matcher;
98 handler: EventHandler;
99}
100declare type Stack = Layer[];
101interface InputLayer {
102 route?: string;
103 match?: Matcher;
104 handler: EventHandler;
105 lazy?: boolean;
106}
107declare type InputStack = InputLayer[];
108declare type Matcher = (url: string, event?: H3Event) => boolean;
109interface AppUse {
110 (route: string | string[], handler: EventHandler | EventHandler[], options?: Partial<InputLayer>): App;
111 (handler: EventHandler | EventHandler[], options?: Partial<InputLayer>): App;
112 (options: InputLayer): App;
113}
114interface AppOptions {
115 debug?: boolean;
116 onError?: (error: Error, event: H3Event) => any;
117}
118interface App {
119 stack: Stack;
120 handler: EventHandler;
121 options: AppOptions;
122 use: AppUse;
123}
124declare function createApp(options?: AppOptions): App;
125declare function use(app: App, arg1: string | EventHandler | InputLayer | InputLayer[], arg2?: Partial<InputLayer> | EventHandler | EventHandler[], arg3?: Partial<InputLayer>): App;
126declare function createAppEventHandler(stack: Stack, options: AppOptions): EventHandler<void>;
127
128/**
129 * H3 Runtime Error
130 * @class
131 * @extends Error
132 * @property {Number} statusCode An Integer indicating the HTTP response status code.
133 * @property {String} statusMessage A String representing the HTTP status message
134 * @property {String} fatal Indicates if the error is a fatal error.
135 * @property {String} unhandled Indicates if the error was unhandled and auto captured.
136 * @property {Any} data An extra data that will includes in the response.<br>
137 * This can be used to pass additional information about the error.
138 * @property {Boolean} internal Setting this property to <code>true</code> will mark error as an internal error
139 */
140declare class H3Error extends Error {
141 static __h3_error__: boolean;
142 toJSON(): Pick<H3Error, "statusCode" | "statusMessage" | "data" | "message">;
143 statusCode: number;
144 fatal: boolean;
145 unhandled: boolean;
146 statusMessage?: string;
147 data?: any;
148}
149/**
150 * Creates new `Error` that can be used to handle both internal and runtime errors.
151 *
152 * @param input {Partial<H3Error>}
153 * @return {H3Error} An instance of the H3Error
154 */
155declare function createError(input: string | Partial<H3Error> & {
156 status?: number;
157 statusText?: string;
158}): H3Error;
159/**
160 * Receive an error and return the corresponding response.<br>
161 * H3 internally uses this function to handle unhandled errors.<br>
162 * Note that calling this function will close the connection and no other data will be sent to client afterwards.
163 *
164 @param event {H3Event} H3 event or req passed by h3 handler
165 * @param error {H3Error|Error} Raised error
166 * @param debug {Boolean} Whether application is in debug mode.<br>
167 * In the debug mode the stack trace of errors will be return in response.
168 */
169declare function sendError(event: H3Event, error: Error | H3Error, debug?: boolean): void;
170declare function isError(input: any): input is H3Error;
171
172declare function useBase(base: string, handler: EventHandler): EventHandler;
173
174/**
175 * Reads body of the request and returns encoded raw string (default) or `Buffer` if encoding if falsy.
176 * @param event {H3Event} H3 event or req passed by h3 handler
177 * @param encoding {Encoding} encoding="utf-8" - The character encoding to use.
178 *
179 * @return {String|Buffer} Encoded raw string or raw Buffer of the body
180 */
181declare function readRawBody(event: H3Event, encoding?: Encoding): Encoding extends false ? Buffer : Promise<string | Buffer | undefined>;
182/**
183 * Reads request body and try to safely parse using [destr](https://github.com/unjs/destr)
184 * @param event {H3Event} H3 event or req passed by h3 handler
185 * @param encoding {Encoding} encoding="utf-8" - The character encoding to use.
186 *
187 * @return {*} The `Object`, `Array`, `String`, `Number`, `Boolean`, or `null` value corresponding to the request JSON body
188 *
189 * ```ts
190 * const body = await useBody(req)
191 * ```
192 */
193declare function readBody<T = any>(event: H3Event): Promise<T>;
194
195interface CacheConditions {
196 modifiedTime?: string | Date;
197 maxAge?: number;
198 etag?: string;
199 cacheControls?: string[];
200}
201/**
202 * Check request caching headers (`If-Modified-Since`) and add caching headers (Last-Modified, Cache-Control)
203 * Note: `public` cache control will be added by default
204 * @returns `true` when cache headers are matching. When `true` is returned, no reponse should be sent anymore
205 */
206declare function handleCacheHeaders(event: H3Event, opts: CacheConditions): boolean;
207
208declare const MIMES: {
209 html: string;
210 json: string;
211};
212
213/**
214 * Parse the request to get HTTP Cookie header string and returning an object of all cookie name-value pairs.
215 * @param event {H3Event} H3 event or req passed by h3 handler
216 * @returns Object of cookie name-value pairs
217 * ```ts
218 * const cookies = parseCookies(event)
219 * ```
220 */
221declare function parseCookies(event: H3Event): Record<string, string>;
222/**
223 * Get a cookie value by name.
224 * @param event {H3Event} H3 event or req passed by h3 handler
225 * @param name Name of the cookie to get
226 * @returns {*} Value of the cookie (String or undefined)
227 * ```ts
228 * const authorization = useCookie(request, 'Authorization')
229 * ```
230 */
231declare function getCookie(event: H3Event, name: string): string | undefined;
232/**
233 * Set a cookie value by name.
234 * @param event {H3Event} H3 event or res passed by h3 handler
235 * @param name Name of the cookie to set
236 * @param value Value of the cookie to set
237 * @param serializeOptions {CookieSerializeOptions} Options for serializing the cookie
238 * ```ts
239 * setCookie(res, 'Authorization', '1234567')
240 * ```
241 */
242declare function setCookie(event: H3Event, name: string, value: string, serializeOptions?: CookieSerializeOptions): void;
243/**
244 * Set a cookie value by name.
245 * @param event {H3Event} H3 event or res passed by h3 handler
246 * @param name Name of the cookie to delete
247 * @param serializeOptions {CookieSerializeOptions} Cookie options
248 * ```ts
249 * deleteCookie(res, 'SessionId')
250 * ```
251 */
252declare function deleteCookie(event: H3Event, name: string, serializeOptions?: CookieSerializeOptions): void;
253
254interface ProxyOptions {
255 headers?: RequestHeaders | HeadersInit;
256 fetchOptions?: RequestInit;
257 fetch?: typeof fetch;
258 sendStream?: boolean;
259}
260declare function proxyRequest(event: H3Event, target: string, opts?: ProxyOptions): Promise<void>;
261declare function sendProxy(event: H3Event, target: string, opts?: ProxyOptions): Promise<void>;
262
263declare function getQuery(event: H3Event): ufo.QueryObject;
264declare function getRouterParams(event: H3Event): H3Event["context"];
265declare function getRouterParam(event: H3Event, name: string): H3Event["context"][string];
266declare function getMethod(event: H3Event, defaultMethod?: HTTPMethod): HTTPMethod;
267declare function isMethod(event: H3Event, expected: HTTPMethod | HTTPMethod[], allowHead?: boolean): boolean;
268declare function assertMethod(event: H3Event, expected: HTTPMethod | HTTPMethod[], allowHead?: boolean): void;
269declare function getRequestHeaders(event: H3Event): RequestHeaders;
270declare const getHeaders: typeof getRequestHeaders;
271declare function getRequestHeader(event: H3Event, name: string): RequestHeaders[string];
272declare const getHeader: typeof getRequestHeader;
273
274declare function send(event: H3Event, data?: any, type?: string): Promise<void>;
275declare function defaultContentType(event: H3Event, type?: string): void;
276declare function sendRedirect(event: H3Event, location: string, code?: number): Promise<void>;
277declare function getResponseHeaders(event: H3Event): ReturnType<H3Event["res"]["getHeaders"]>;
278declare function getResponseHeader(event: H3Event, name: string): ReturnType<H3Event["res"]["getHeader"]>;
279declare function setResponseHeaders(event: H3Event, headers: Record<string, Parameters<OutgoingMessage["setHeader"]>[1]>): void;
280declare const setHeaders: typeof setResponseHeaders;
281declare function setResponseHeader(event: H3Event, name: string, value: Parameters<OutgoingMessage["setHeader"]>[1]): void;
282declare const setHeader: typeof setResponseHeader;
283declare function appendResponseHeaders(event: H3Event, headers: Record<string, string>): void;
284declare const appendHeaders: typeof appendResponseHeaders;
285declare function appendResponseHeader(event: H3Event, name: string, value: string): void;
286declare const appendHeader: typeof appendResponseHeader;
287declare function isStream(data: any): any;
288declare function sendStream(event: H3Event, data: any): Promise<void>;
289declare function writeEarlyHints(event: H3Event, hints: string | string[] | Record<string, string | string[]>, cb?: () => void): void;
290
291declare type RouterMethod = Lowercase<HTTPMethod>;
292declare type RouterUse = (path: string, handler: EventHandler, method?: RouterMethod | RouterMethod[]) => Router;
293declare type AddRouteShortcuts = Record<RouterMethod, RouterUse>;
294interface Router extends AddRouteShortcuts {
295 add: RouterUse;
296 use: RouterUse;
297 handler: EventHandler;
298}
299interface CreateRouterOptions {
300 preemtive?: boolean;
301}
302declare function createRouter(opts?: CreateRouterOptions): Router;
303
304export { AddRouteShortcuts, App, AppOptions, AppUse, CacheConditions, CreateRouterOptions, DynamicEventHandler, Encoding, EventHandler, EventHandlerResponse, H3Error, H3Event, H3EventContext, H3Headers, H3Response, HTTPMethod, InputLayer, InputStack, Layer, LazyEventHandler, MIMES, Matcher, NodeEventContext, NodeListener, NodeMiddleware, NodePromisifiedHandler, ProxyOptions, RequestHeaders, Router, RouterMethod, RouterUse, Stack, appendHeader, appendHeaders, appendResponseHeader, appendResponseHeaders, assertMethod, callNodeListener, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineLazyEventHandler, defineNodeListener, defineNodeMiddleware, deleteCookie, dynamicEventHandler, eventHandler, fromNodeMiddleware, getCookie, getHeader, getHeaders, getMethod, getQuery, getRequestHeader, getRequestHeaders, getResponseHeader, getResponseHeaders, getRouterParam, getRouterParams, handleCacheHeaders, isError, isEvent, isEventHandler, isMethod, isStream, lazyEventHandler, parseCookies, promisifyNodeListener, proxyRequest, readBody, readRawBody, send, sendError, sendProxy, sendRedirect, sendStream, setCookie, setHeader, setHeaders, setResponseHeader, setResponseHeaders, toEventHandler, toNodeListener, use, useBase, writeEarlyHints };