import { RouteTable } from "worlds-fastest-router"; import { Request, Response, Message, ResponseInit, ResponseInitObject } from "./Datagram/datagram-types.js" import { CResponse } from "./Datagram/datagram.js"; import { IMachine, processMessageByHandler, processRequestByHandler } from "./Machine.js"; import { Subscription } from "./util/Subscription.js"; export type Handler = (request: Request) => Promise | ResponseInit; export type MessageHandler = (message: Message) => void; export class Server extends RouteTable implements IMachine { GET(pathTemplate: string, handler: Handler) { this.register(`GET ${pathTemplate}`, handler); } POST(pathTemplate: string, handler: Handler) { this.register(`POST ${pathTemplate}`, handler); } PATCH(pathTemplate: string, handler: Handler) { this.register(`PATCH ${pathTemplate}`, handler); } PUT(pathTemplate: string, handler: Handler) { this.register(`PUT ${pathTemplate}`, handler); } DELETE(pathTemplate: string, handler: Handler) { this.register(`DELETE ${pathTemplate}`, handler); } tryRequest(request: Request): Subscription | null { let handler = this.find(`${request.method} ${request.path}`) as Handler | null; if (handler == null) { return null; } return processRequestByHandler(handler, request); } tryMessage(message: Message): void { let handler = this.find(`${message.method} ${message.path}`) as MessageHandler | null; if (handler !== null) { processMessageByHandler(handler, message); } } async onRequest(request: Request): Promise { let method: string = request.method ?? "GET"; let found = this.find(`${method} ${request.path}`); if (found == null) { return Promise.reject(`No handler for ${method} ${request.path}`); } let handler = found.treasure as Handler; console.log("found handler", handler); return handler(request); } }