UNPKG

2.65 kBTypeScriptView Raw
1/// <reference lib="webworker" />
2
3import type { ServerResponse } from 'worktop/response';
4import type { ServerRequest, Params, Method } from 'worktop/request';
5
6type Promisable<T> = Promise<T> | T;
7
8type CronHandler = (event: CronEvent) => void;
9export type ResponseHandler = (event: FetchEvent) => Promisable<Response>;
10export type FetchHandler = (event: FetchEvent, request?: Request | string) => void;
11
12interface CronEvent {
13 type: 'scheduled';
14 /**
15 * The CRON trigger
16 * @example "23 59 LW * *"
17 */
18 cron: string;
19 /**
20 * Milliseconds since UNIX epoch.
21 * @example new Date(evt.scheduledTime)
22 */
23 scheduledTime: number;
24 /**
25 * Method wrapper for event's action handler.
26 */
27 waitUntil(f: Promisable<any>): void;
28}
29
30declare global {
31 function addEventListener(type: 'fetch', handler: FetchHandler): void;
32 function addEventListener(type: 'scheduled', handler: CronHandler): void;
33}
34
35/**
36 * Return the `handler` with an `event.respondWith` wrapper.
37 * @param {ResponseHandler} handler
38 */
39export function reply(handler: ResponseHandler): FetchHandler;
40
41/**
42 * Assign the `handler` to the "fetch" event.
43 * @note Your `handler` will be wrapped by `reply` automatically.
44 * @param {ResponseHandler} handler
45 */
46export function listen(handler: ResponseHandler): void;
47
48export type Handler<P extends Params = Params> = (req: ServerRequest<P>, res: ServerResponse) => Promisable<Response|void>;
49
50export type RouteParams<T extends string> =
51 T extends `${infer Prev}/*/${infer Rest}`
52 ? RouteParams<Prev> & { wild: string } & RouteParams<Rest>
53 : T extends `${string}:${infer P}?/${infer Rest}`
54 ? { [K in P]?: string } & RouteParams<Rest>
55 : T extends `${string}:${infer P}/${infer Rest}`
56 ? { [K in P]: string } & RouteParams<Rest>
57 : T extends `${string}:${infer P}?`
58 ? { [K in P]?: string }
59 : T extends `${string}:${infer P}`
60 ? { [K in P]: string }
61 : T extends `${string}*`
62 ? { wild: string }
63 : {};
64
65export declare class Router {
66 add<T extends RegExp>(method: Method, route: T, handler: Handler<Params>): void;
67 add<T extends string>(method: Method, route: T, handler: Handler<RouteParams<T>>): void;
68 run(event: FetchEvent): Promise<Response>;
69 onerror(req: ServerRequest, res: ServerResponse, status?: number, error?: Error): Promisable<Response>;
70 prepare?(req: Omit<ServerRequest, 'params'>, res: ServerResponse): Promisable<Response|void>;
71}
72
73// TODO?: worktop/status | worktop/errors
74export declare var STATUS_CODES: Record<string|number, string>;
75
76/**
77 * Compose multiple `Handler` functions together, creating a final handler.
78 */
79export function compose<P extends Params = Params>(...handlers: Handler<P>[]): Handler<P>;