diff --git a/config.ts b/config.ts index 67b6a54..c4d6883 100644 --- a/config.ts +++ b/config.ts @@ -39,6 +39,7 @@ export type ConfigType = { check_file_hash: boolean; import_method: ImportMethod; max_import_img_count: number; + enable_server_timing: boolean; }; export enum ThumbnailMethod { @@ -239,6 +240,9 @@ export class Config { get max_import_img_count() { return this._return_number("max_import_img_count") || 3; } + get enable_server_timing() { + return this._return_bool("enable_server_timing") ?? false; + } to_json(): ConfigType { return { cookies: typeof this.cookies === "string", @@ -277,6 +281,7 @@ export class Config { check_file_hash: this.check_file_hash, import_method: this.import_method, max_import_img_count: this.max_import_img_count, + enable_server_timing: this.enable_server_timing, }; } } diff --git a/routes/_middleware.ts b/routes/_middleware.ts index 7a7c8b7..f63341d 100644 --- a/routes/_middleware.ts +++ b/routes/_middleware.ts @@ -13,6 +13,9 @@ const STATIC_FILES = ["/common.css", "/scrollBar.css", "/sw.js", "/sw.js.map"]; export async function handler(req: Request, ctx: FreshContext) { const url = new URL(req.url); + const m = get_task_manager(); + const enable_server_timing = m.cfg.enable_server_timing; + const start = enable_server_timing ? Date.now() : 0; if (url.pathname == "/sw.js") { build_sw(); } @@ -31,7 +34,6 @@ export async function handler(req: Request, ctx: FreshContext) { return get_file_response(file, opts); } if (url.pathname == "/flutter" || url.pathname.startsWith("/flutter/")) { - const m = get_task_manager(); let flutter_base = import.meta.resolve("../static/flutter").slice(7); if (Deno.build.os === "windows") { flutter_base = flutter_base.slice(1); @@ -66,7 +68,6 @@ export async function handler(req: Request, ctx: FreshContext) { return await get_file_response(p, opts); } if (url.pathname.startsWith("/canvaskit/")) { - const m = get_task_manager(); let flutter_base = import.meta.resolve("../static/flutter").slice(7); if (Deno.build.os === "windows") { flutter_base = flutter_base.slice(1); @@ -89,5 +90,16 @@ export async function handler(req: Request, ctx: FreshContext) { return await get_file_response(p, opts); } const res = await ctx.next(); + if (enable_server_timing) { + if (res.status === 101) return res; + const headers = new Headers(res.headers); + const now = Date.now(); + headers.append("Server-Timing", `total;dur=${now - start}`); + return new Response(res.body, { + status: res.status, + headers: headers, + statusText: res.statusText, + }); + } return res; } diff --git a/routes/api/_middleware.ts b/routes/api/_middleware.ts index a34528b..ec9ef98 100644 --- a/routes/api/_middleware.ts +++ b/routes/api/_middleware.ts @@ -59,6 +59,8 @@ function handle_auth(req: Request, ctx: FreshContext) { export async function handler(req: Request, ctx: FreshContext) { const m = get_task_manager(); + const enable_server_timing = m.cfg.enable_server_timing; + const start = enable_server_timing ? Date.now() : 0; if (!(handle_auth(req, ctx))) { const headers: HeadersInit = {}; const origin = req.headers.get("origin"); @@ -67,6 +69,10 @@ export async function handler(req: Request, ctx: FreshContext) { headers["Access-Control-Allow-Origin"] = origin; if (c) headers["Access-Control-Allow-Credentials"] = "true"; } + if (enable_server_timing) { + const end = Date.now(); + headers["Server-Timing"] = `api;dur=${end - start}`; + } return return_error(401, "Unauthorized", 401, headers); } const res = await ctx.next(); @@ -86,6 +92,10 @@ export async function handler(req: Request, ctx: FreshContext) { if (c) headers.set("Access-Control-Allow-Credentials", "true"); headers.set("Access-Control-Allow-Private-Network", "true"); } + if (enable_server_timing) { + const end = Date.now(); + headers.append("Server-Timing", `api;dur=${end - start}`); + } return new Response(null, { status: 204, headers }); } else { if (res.status === 101) return res; @@ -118,6 +128,10 @@ export async function handler(req: Request, ctx: FreshContext) { } } } + if (enable_server_timing) { + const end = Date.now(); + headers.append("Server-Timing", `api;dur=${end - start}`); + } return new Response(res.body, { status: res.status, headers: headers, diff --git a/routes/api/files/[token].ts b/routes/api/files/[token].ts index 25f8d2d..1f58910 100644 --- a/routes/api/files/[token].ts +++ b/routes/api/files/[token].ts @@ -12,6 +12,9 @@ export const handler: Handlers = { } const tokens = ctx.params.token.split(","); const m = get_task_manager(); + const enable_server_timing = m.cfg.enable_server_timing; + const start = enable_server_timing ? Date.now() : 0; + const headers: HeadersInit = {}; const data: EhFiles = {}; for (const token of tokens) { data[token] = m.db.get_files(token).map((d) => { @@ -22,6 +25,10 @@ export const handler: Handlers = { return d; }); } - return return_data(data); + if (enable_server_timing) { + const end = Date.now(); + headers["Server-Timing"] = `db;dur=${end - start}`; + } + return return_data(data, 200, headers); }, };