export class HttpError extends Error { public readonly cause?: Error; public readonly statusCode: TCode; public readonly message: string; public readonly url: string | undefined; public readonly method: string | undefined; constructor(opts: { url?: string; method?: string; message?: string; statusCode: TCode; cause?: Error }) { super(opts.message ?? `HTTP Error ${opts.statusCode} `); Object.setPrototypeOf(this, HttpError.prototype); this.name = HttpError.prototype.constructor.name; this.cause = opts.cause; this.statusCode = opts.statusCode; this.url = opts.url; this.method = opts.method; this.message = opts.message ?? `HTTP Error ${opts.statusCode}`; if (opts.cause instanceof Error && opts.cause.stack) { this.stack = opts.cause.stack; } } public static fromRequest(request: Request, response: Response) { return new HttpError({ message: response.statusText, url: response.url, method: request.method, statusCode: response.status, }); } }