ionian/packages/server/src/route/error_handler.ts

52 lines
1.3 KiB
TypeScript

import { ZodError } from "dbtype";
export interface ErrorFormat {
code: number;
message: string;
detail?: string;
}
export class ClientRequestError extends Error {
code: number;
constructor(code: number, message: string) {
super(message);
this.name = "client request error";
this.code = code;
}
}
const code_to_message_table: { [key: number]: string | undefined } = {
400: "BadRequest",
404: "NotFound",
};
export const error_handler = ({ code, error, set }: { code: string, error: Error, set: { status?: number | string } }) => {
if (error instanceof ClientRequestError) {
set.status = error.code;
return {
code: error.code,
message: code_to_message_table[error.code] ?? "",
detail: error.message,
} satisfies ErrorFormat;
}
if (error instanceof ZodError) {
set.status = 400;
return {
code: 400,
message: "BadRequest",
detail: error.errors.map((x) => x.message).join(", "),
} satisfies ErrorFormat;
}
set.status = 500;
return {
code: 500,
message: "Internal Server Error",
detail: error.message,
}
};
export const sendError = (code: number, message?: string): never => {
throw new ClientRequestError(code, message ?? "");
};