import { Application, Context, Next, Router } from "jsr:@oak/oak"; export enum APIErrorCode { NOT_IMPLEMENTED = "NOT_IMPLEMENTED", SERVER_ERROR = "SERVER_ERROR", } export interface APIError { code: APIErrorCode; message: string; } export interface APISuccess { success: true; data: T; error?: never; } export interface APIFailure { success: false; data?: never; error: APIError; } export type APIResponse = APISuccess | APIFailure; class APIException extends Error { readonly code: APIErrorCode; readonly status: number; constructor(code: APIErrorCode, status: number, message: string) { super(message); this.code = code; this.status = status; } } async function errorMiddleware(ctx: Context, next: Next) { try { // On passe à la prochaine fonction de la chaîne await next(); } catch (err) { if (err instanceof APIException) { const responseBody: APIFailure = { success: false, error: { code: err.code, message: err.message, } }; ctx.response.status = err.status; ctx.response.body = responseBody; } else { console.error(err); const responseBody: APIFailure = { success: false, error: { code: APIErrorCode.SERVER_ERROR, message: "Unexpected server error", } }; ctx.response.status = 500; ctx.response.body = responseBody; } } } const router = new Router(); router.get("/", errorMiddleware, (ctx) => { throw new APIException(APIErrorCode.NOT_IMPLEMENTED, 501, "I need more time..."); }); const app = new Application(); app.use(router.routes()); app.use(router.allowedMethods()); app.listen({ port: 8000 });