Fork of github.com/did-method-plc/did-method-plc
1import { PlcError } from '@did-plc/lib'
2import { ErrorRequestHandler } from 'express'
3
4export const handler: ErrorRequestHandler = (err, req, res, next) => {
5 // normalize our PLC errors to server errors
6 if (PlcError.is(err)) {
7 err = ServerError.fromPlcError(err)
8 }
9
10 req.log.info(
11 err,
12 ServerError.is(err)
13 ? 'handled server error'
14 : 'unexpected internal server error',
15 )
16 if (res.headersSent) {
17 return next(err)
18 }
19 if (ServerError.is(err)) {
20 return res.status(err.status).json({ message: err.message })
21 } else {
22 return res.status(500).json({ message: 'Internal Server Error' })
23 }
24}
25
26export class ServerError extends Error {
27 status: number
28 constructor(status: number, message: string) {
29 super(message)
30 this.status = status
31 }
32
33 static is(obj: unknown): obj is ServerError {
34 return (
35 !!obj &&
36 typeof obj === 'object' &&
37 typeof (obj as Record<string, unknown>).message === 'string' &&
38 typeof (obj as Record<string, unknown>).status === 'number'
39 )
40 }
41
42 static fromPlcError(err: PlcError): ServerError {
43 return new ServerError(400, err.message)
44 }
45}