102 lines
2.6 KiB
TypeScript
102 lines
2.6 KiB
TypeScript
type Method = "get" | "post" | "put" | "patch" | "delete";
|
|
|
|
import { HttpCode, httpCodes } from "./http-codes.ts";
|
|
import { ContentType, contentTypes } from "./content-types";
|
|
import { services } from "./services";
|
|
|
|
type Response = {
|
|
code: HttpCode;
|
|
contentType: ContentType;
|
|
result: string;
|
|
};
|
|
|
|
type Handler = (req: Request) => Response;
|
|
|
|
const phandler: Handler = (req: Request) => {
|
|
const code = httpCodes.success.OK;
|
|
return {
|
|
code,
|
|
result: "it is ok ",
|
|
contentType: contentTypes.text.plain,
|
|
};
|
|
};
|
|
|
|
type Route = {
|
|
path: string;
|
|
methods: Method[];
|
|
handler: Handler;
|
|
};
|
|
|
|
const routes: Route[] = [
|
|
{
|
|
path: "/ok",
|
|
methods: ["get"],
|
|
handler: (req) => {
|
|
const code = httpCodes.success.OK;
|
|
const rn = services.random.randomNumber();
|
|
|
|
return {
|
|
code,
|
|
result: "it is ok " + rn,
|
|
contentType: contentTypes.text.plain,
|
|
};
|
|
},
|
|
},
|
|
{
|
|
path: "/alsook",
|
|
methods: ["get"],
|
|
handler: (req) => {
|
|
const code = httpCodes.success.OK;
|
|
return {
|
|
code,
|
|
result: "it is also ok",
|
|
contentType: contentTypes.text.plain,
|
|
};
|
|
},
|
|
},
|
|
];
|
|
|
|
type DenoRequest = globalThis.Request;
|
|
type UserRequest = {};
|
|
type Request = {
|
|
pattern: string;
|
|
path: string;
|
|
method: Method;
|
|
parameters: object;
|
|
denoRequest: globalThis.Request;
|
|
};
|
|
type ProcessedRoute = { pattern: URLPattern; method: Method; handler: Handler };
|
|
const processedRoutes: ProcessedRoute[] = routes.map(
|
|
(route: Route, idx: number, allRoutes: Route[]) => {
|
|
const pattern: URLPattern = new URLPattern({ pathname: route.path });
|
|
const method: Method = route.method;
|
|
const handler = (denoRequest: DenoRequest) => {
|
|
const req: Request = {
|
|
pattern: route.pattern,
|
|
path: denoRequest.path,
|
|
method: denoRequest.method,
|
|
parameters: { one: 1, two: 2 },
|
|
denoRequest,
|
|
};
|
|
return route.handler(req);
|
|
};
|
|
|
|
return { pattern, method, handler };
|
|
},
|
|
);
|
|
|
|
function handler(req: globalThis.Request): globalThis.Response {
|
|
for (const [idx, pr] of processedRoutes.entries()) {
|
|
const match = pr.pattern.exec(req.url);
|
|
if (match) {
|
|
const resp = pr.handler(req);
|
|
|
|
return new globalThis.Response(resp.result);
|
|
}
|
|
}
|
|
|
|
return new globalThis.Response("not found", { status: 404 });
|
|
}
|
|
|
|
Deno.serve(handler);
|