brf/server/handlers/error.ts
2025-11-24 17:09:09 +01:00

40 lines
1.1 KiB
TypeScript

import { DatabaseError } from 'pg-protocol'
import StatusError from '../lib/status_error.ts'
const databaseErrorCodes = {
23505: 409,
23514: 409,
}
function defaultHandler(error, request, reply) {
return reply
.type('text/html')
.send(
`<h1>Error</h1><pre>${JSON.stringify(error, ['name', ...Object.getOwnPropertyNames(error)], 2).replaceAll('\\n', '\n')}</pre>`,
)
}
export default function ErrorHandler(handler = defaultHandler) {
return async function errorHandler(error, request, reply) {
if (error instanceof DatabaseError && error.code in databaseErrorCodes) {
error = new StatusError(databaseErrorCodes[error.code], error.detail || 'Database Error', { cause: error })
}
reply.log.error({ req: request, err: error }, error?.message)
reply.status(error.status || error.statusCode || 500)
if (request.headers.accept?.includes('application/json')) {
return reply.send(
error.toJSON?.() || {
name: error.name,
message: error.message,
status: error.status || error.statusCode || 500,
},
)
}
return handler(error, request, reply)
}
}