export class Router { private routes: Record = {}; public route(route: string) { const methods: Record = { get: () => undefined, post: () => undefined, put: () => undefined, delete: () => undefined, }; this.routes[route] = this.routes[route] || []; this.routes[route].push((r, c) => { switch (r.method) { case "GET": return methods.get?.(r, c); case "POST": return methods.post?.(r, c); case "PUT": return methods.put?.(r, c); case "DELETE": return methods.delete?.(r, c); default: return undefined; } }); return { get(handler: Handler) { methods.get = handler; return this; }, post(handler: Handler) { methods.post = handler; return this; }, put(handler: Handler) { methods.put = handler; return this; }, delete(handler: Handler) { methods.delete = handler; return this; }, }; } public handle = async (req: Request): Promise => { const url = new URL(req.url); const route = url.pathname; if (route in this.routes) { let res; for (const handler of this.routes[route]) { res = await handler(req, { url, state: {}, }); if (res) { return res; } } } return new Response("Not found", { status: 404 }); }; } export type Handler = ( req: Request, ctx: Context, ) => Promise | Response | undefined;