replace URL with split to gain some extra performance
This commit is contained in:
parent
bbc861fde3
commit
42ae41ba87
|
@ -1,16 +1,16 @@
|
|||
import { Status } from "https://deno.land/std@0.186.0/http/http_status.ts";
|
||||
import { hrtime } from "https://deno.land/std@0.177.0/node/process.ts";
|
||||
import prettyTime from 'npm:pretty-time';
|
||||
import prettyTime from "npm:pretty-time";
|
||||
import { HTTPServer } from "../mod.ts";
|
||||
|
||||
const httpServer = new HTTPServer();
|
||||
|
||||
httpServer.middleware(async (req, done) => {
|
||||
const started = hrtime();
|
||||
const perStart = performance.now();
|
||||
console.log(`${req.method} - ${req.ip()} - ${req.path}`);
|
||||
await done();
|
||||
const processTime = hrtime(started);
|
||||
console.log(`Processed in ${prettyTime(processTime)}`);
|
||||
const pt = performance.now() - perStart;
|
||||
const hrArray: number[] = [0, Math.trunc(pt * 1000000)];
|
||||
console.log(`Processed in ${prettyTime(hrArray)}`);
|
||||
});
|
||||
|
||||
httpServer.error((req, _rep) => {
|
||||
|
|
41
mod.ts
41
mod.ts
|
@ -22,8 +22,7 @@ type RouteHandler = (
|
|||
type RouteMiddlewareHandler = (
|
||||
req: RouteRequest,
|
||||
done: () => Promise<unknown>,
|
||||
) =>
|
||||
| Promise<void>;
|
||||
) => Promise<void>;
|
||||
|
||||
type RouteParam = {
|
||||
idx: number;
|
||||
|
@ -100,14 +99,22 @@ export class HTTPServer {
|
|||
private async handleHttp(conn: Deno.Conn) {
|
||||
const httpConn = Deno.serveHttp(conn);
|
||||
for await (const requestEvent of httpConn) {
|
||||
const routeRequest = new RouteRequest(requestEvent.request, conn);
|
||||
const filepath = decodeURIComponent(
|
||||
"/" + requestEvent.request.url.split("/").slice(3).join("/"),
|
||||
);
|
||||
const routeRequest = new RouteRequest(
|
||||
requestEvent.request,
|
||||
conn,
|
||||
filepath,
|
||||
requestEvent.request.url,
|
||||
);
|
||||
const routeReply: RouteReply = new RouteReply();
|
||||
const url = new URL(requestEvent.request.url);
|
||||
const filepath = decodeURIComponent(url.pathname);
|
||||
|
||||
if (filepath.startsWith("/_static")) {
|
||||
this.handleNotFound(routeRequest, routeReply, requestEvent);
|
||||
continue;
|
||||
}
|
||||
|
||||
let resolveAction: (value?: unknown) => void = () => {};
|
||||
let middlewarePromise;
|
||||
|
||||
|
@ -131,21 +138,20 @@ export class HTTPServer {
|
|||
try {
|
||||
file = await Deno.open(pathLoc, { read: true });
|
||||
} catch {
|
||||
this.handleNotFound(routeRequest, routeReply, requestEvent);
|
||||
if (middlewarePromise) resolveAction();
|
||||
this.handleNotFound(routeRequest, routeReply, requestEvent);
|
||||
continue;
|
||||
}
|
||||
|
||||
const readableStream = file.readable;
|
||||
const response = new Response(readableStream);
|
||||
await requestEvent.respondWith(response);
|
||||
if (middlewarePromise) resolveAction();
|
||||
await requestEvent.respondWith(response);
|
||||
return;
|
||||
}
|
||||
|
||||
const routeName = `${requestEvent.request.method}@${filepath}`;
|
||||
let route = this.routes.has(routeName)
|
||||
? this.routes.get(routeName)
|
||||
: undefined;
|
||||
let route = this.routes.get(routeName);
|
||||
|
||||
if (route) {
|
||||
let handler = await route.handler(
|
||||
|
@ -157,6 +163,7 @@ export class HTTPServer {
|
|||
handler = JSON.stringify(handler, null, 2);
|
||||
}
|
||||
|
||||
if (middlewarePromise) resolveAction();
|
||||
await requestEvent.respondWith(
|
||||
new Response(handler as string, {
|
||||
status: routeReply.statusCode,
|
||||
|
@ -164,7 +171,6 @@ export class HTTPServer {
|
|||
statusText: STATUS_TEXT[routeReply.statusCode],
|
||||
}),
|
||||
);
|
||||
if (middlewarePromise) resolveAction();
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -189,6 +195,7 @@ export class HTTPServer {
|
|||
routeRequest,
|
||||
routeReply,
|
||||
);
|
||||
if (middlewarePromise) resolveAction();
|
||||
await requestEvent.respondWith(
|
||||
new Response(handler as string, {
|
||||
status: routeReply.statusCode,
|
||||
|
@ -196,11 +203,10 @@ export class HTTPServer {
|
|||
statusText: STATUS_TEXT[routeReply.statusCode],
|
||||
}),
|
||||
);
|
||||
if (middlewarePromise) resolveAction();
|
||||
continue;
|
||||
}
|
||||
this.handleNotFound(routeRequest, routeReply, requestEvent);
|
||||
if (middlewarePromise) resolveAction();
|
||||
this.handleNotFound(routeRequest, routeReply, requestEvent);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -293,14 +299,13 @@ export class RouteRequest {
|
|||
pathParams: { [key: string]: string };
|
||||
private remoteIpAddr: string;
|
||||
|
||||
constructor(request: Request, conn: Deno.Conn) {
|
||||
this.url = request.url;
|
||||
const urlObj = new URL(request.url);
|
||||
this.path = decodeURIComponent(urlObj.pathname);
|
||||
constructor(request: Request, conn: Deno.Conn, path: string, url: string) {
|
||||
this.url = url;
|
||||
this.path = decodeURIComponent(path);
|
||||
this.headers = request.headers;
|
||||
this.method = request.method as HTTPMethod;
|
||||
this.pathParams = {};
|
||||
this.queryParams = this.paramsToObject(urlObj.searchParams.entries());
|
||||
this.queryParams = this.paramsToObject(new URL(url).searchParams.entries());
|
||||
this.remoteIpAddr = "hostname" in conn.remoteAddr
|
||||
? conn.remoteAddr["hostname"]
|
||||
: "127.0.0.1";
|
||||
|
|
Reference in New Issue
Block a user