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}