48 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| //routes/middleware-error-handler/_middleware.ts
 | |
| import { FreshContext } from "$fresh/server.ts";
 | |
| import { DomainError } from "@lib/errors.ts";
 | |
| import { getCookies } from "@std/http/cookie";
 | |
| import { verify } from "https://deno.land/x/djwt@v2.2/mod.ts";
 | |
| import * as perf from "@lib/performance.ts";
 | |
| import { JWT_SECRET } from "@lib/env.ts";
 | |
| 
 | |
| export async function handler(
 | |
|   req: Request,
 | |
|   ctx: FreshContext,
 | |
| ) {
 | |
|   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(sessionCookie, JWT_SECRET, "HS512");
 | |
|         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,
 | |
|     });
 | |
|   }
 | |
| }
 |