errors: set statusCode in ResponseError

Signed-off-by: Vincenzo Scamporlino <vincenzos@spotify.com>
This commit is contained in:
Vincenzo Scamporlino
2024-02-01 16:26:14 +01:00
parent 7abc4837e1
commit c9e5b59f78
2 changed files with 20 additions and 8 deletions
@@ -35,6 +35,8 @@ describe('ResponseError', () => {
const e = await ResponseError.fromResponse(response as Response);
expect(e.name).toEqual('ResponseError');
expect(e.message).toEqual('Request failed with 444 Fours');
expect(e.statusCode).toEqual(444);
expect(e.statusText).toEqual('Fours');
expect(e.cause.name).toEqual('Fours');
expect(e.cause.message).toEqual('Expected fives');
expect(e.cause.stack).toEqual('lines');
+18 -8
View File
@@ -53,6 +53,9 @@ export class ResponseError extends Error {
*/
readonly cause: Error;
readonly statusCode: number;
readonly statusText: string;
/**
* Constructs a ResponseError based on a failed response.
*
@@ -65,9 +68,9 @@ export class ResponseError extends Error {
): Promise<ResponseError> {
const data = await parseErrorResponseBody(response);
const status = data.response.statusCode || response.status;
const statusText = data.error.name || response.statusText;
const message = `Request failed with ${status} ${statusText}`;
const statusCode = data.response.statusCode || response.status;
const statusText = response.statusText;
const message = `Request failed with ${statusCode} ${statusText}`;
const cause = deserializeError(data.error);
return new ResponseError({
@@ -75,19 +78,26 @@ export class ResponseError extends Error {
response,
data,
cause,
statusCode,
statusText,
});
}
private constructor(props: {
private constructor(opts: {
message: string;
response: ConsumedResponse;
data: ErrorResponseBody;
cause: Error;
statusCode: number;
statusText: string;
}) {
super(props.message);
super(opts.message);
this.name = 'ResponseError';
this.response = props.response;
this.body = props.data;
this.cause = props.cause;
this.response = opts.response;
this.body = opts.data;
this.cause = opts.cause;
this.statusCode = opts.statusCode;
this.statusText = opts.statusText;
}
}