From 405a3c44059a51a581fe9da4901c531eb80cf3ca Mon Sep 17 00:00:00 2001 From: Max Kurapov Date: Wed, 3 Jul 2024 11:10:04 +0200 Subject: [PATCH] chore(open-payments): parse error objects, and return error codes --- packages/open-payments/README.md | 1 + packages/open-payments/src/client/requests.ts | 32 ++++++++++++++----- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/packages/open-payments/README.md b/packages/open-payments/README.md index ff1fa2ef..73e7b54b 100644 --- a/packages/open-payments/README.md +++ b/packages/open-payments/README.md @@ -104,6 +104,7 @@ try { } catch (error) { if (error instanceof OpenPaymentsClientError) { console.log(error.message) + console.log(error.code) // the error code from the Open Payments API console.log(error.description) // additional description of the error console.log(error.status) // the HTTP status of the request, if a request failure console.log(error.validationErrors) // an array of validation errors. Populated if the response of the request failed OpenAPI specfication validation, or other validation checks. diff --git a/packages/open-payments/src/client/requests.ts b/packages/open-payments/src/client/requests.ts index 79437408..6a1586b2 100644 --- a/packages/open-payments/src/client/requests.ts +++ b/packages/open-payments/src/client/requests.ts @@ -158,23 +158,32 @@ const handleError = async ( let errorDescription let errorStatus let validationErrors + let errorCode const { HTTPError } = await import('ky') if (error instanceof HTTPError) { - let responseBody + let responseBody: + | { + error: { description: string; code: string } + } + | string + | undefined try { - responseBody = (await error.response.json()) as { message: string } + responseBody = await error.response.text() + responseBody = JSON.parse(responseBody) } catch { // Ignore if we can't parse the response body (or no body exists) } + errorStatus = error.response.status errorDescription = - responseBody && responseBody.message - ? responseBody.message - : error.message - errorStatus = error.response?.status + typeof responseBody === 'object' + ? responseBody.error.description + : responseBody || error.message + errorCode = + typeof responseBody === 'object' ? responseBody.error.code : undefined } else if (isValidationError(error)) { errorDescription = 'Could not validate OpenAPI response' validationErrors = error.errors.map((e) => e.message) @@ -188,14 +197,21 @@ const handleError = async ( const errorMessage = `Error making Open Payments ${requestType} request` deps.logger.error( - { status: errorStatus, errorDescription, url, requestType }, + { + method: requestType, + url, + status: errorStatus, + description: errorDescription, + code: errorCode + }, errorMessage ) throw new OpenPaymentsClientError(errorMessage, { description: errorDescription, validationErrors, - status: errorStatus + status: errorStatus, + code: errorCode }) }