Files
memorium/routes/_middleware.ts
2026-01-10 13:03:29 +01:00

62 lines
1.5 KiB
TypeScript

import { DomainError } from "@lib/errors.ts";
import { getCookies } from "@std/http/cookie";
import { verify } from "@zaubrik/djwt";
import * as perf from "@lib/performance.ts";
import { JWT_SECRET } from "@lib/env.ts";
import { define } from "../utils.ts";
function importKey(secret: string) {
return crypto.subtle.importKey(
"raw",
new TextEncoder().encode(secret),
{ name: "HMAC", hash: "SHA-512" },
false,
["sign", "verify"],
);
}
const authMiddleware = define.middleware(async function (
ctx,
) {
const req = ctx.req;
try {
performance.mark("a");
const allCookies = getCookies(req.headers);
const sessionCookie = allCookies["session_cookie"];
if (!ctx.state.session && sessionCookie && JWT_SECRET) {
try {
const payload = await verify<typeof ctx.state.session>(
sessionCookie,
await importKey(JWT_SECRET),
);
if (payload) {
ctx.state.session = payload;
}
} catch (_err) {
console.log({ _err });
}
}
const resp = await ctx.next();
performance.mark("b");
const b = performance.measure("a->b", "a", "b");
perf.savePerformance(req.url, b.duration);
return resp;
} catch (error) {
console.error("Error", error);
if (error instanceof DomainError) {
return new Response(error.statusText, {
status: error.status,
});
}
return new Response("Internal Server Error", {
status: 500,
});
}
});
export default [authMiddleware];