diff --git a/src/appstore.js b/src/appstore.js index 62e9d1572..e751cfe24 100644 --- a/src/appstore.js +++ b/src/appstore.js @@ -103,7 +103,7 @@ async function login(email, password, totpToken) { .timeout(60 * 1000) .ok(() => true)); - if (error) throw new BoxError(BoxError.NETWORK_ERROR, error.message); + if (error) throw new BoxError(BoxError.NETWORK_ERROR, error); if (response.status === 401) throw new BoxError(BoxError.INVALID_CREDENTIALS, response.body.message); if (response.status !== 200) throw new BoxError(BoxError.EXTERNAL_ERROR, `Login error. status code: ${response.status}`); if (!response.body.accessToken) throw new BoxError(BoxError.EXTERNAL_ERROR, `Login error. invalid response: ${response.text}`); @@ -120,7 +120,7 @@ async function registerUser(email, password) { .timeout(60 * 1000) .ok(() => true)); - if (error) throw new BoxError(BoxError.NETWORK_ERROR, error.message); + if (error) throw new BoxError(BoxError.NETWORK_ERROR, error); if (response.status === 409) throw new BoxError(BoxError.ALREADY_EXISTS, 'Registration error: account already exists'); if (response.status !== 201) throw new BoxError(BoxError.EXTERNAL_ERROR, `Registration error. invalid response: ${response.status}`); } @@ -134,7 +134,7 @@ async function getSubscription() { .timeout(60 * 1000) .ok(() => true)); - if (error) throw new BoxError(BoxError.NETWORK_ERROR, error.message); + if (error) throw new BoxError(BoxError.NETWORK_ERROR, error); if (response.status === 401) throw new BoxError(BoxError.INVALID_CREDENTIALS); if (response.status === 502) throw new BoxError(BoxError.EXTERNAL_ERROR, `Stripe error: ${response.status} ${JSON.stringify(response.body)}`); if (response.status !== 200) throw new BoxError(BoxError.EXTERNAL_ERROR, `Unknown error: ${response.status} ${JSON.stringify(response.body)}`); @@ -165,7 +165,7 @@ async function purchaseApp(data) { .timeout(60 * 1000) .ok(() => true)); - if (error) throw new BoxError(BoxError.NETWORK_ERROR, error.message); + if (error) throw new BoxError(BoxError.NETWORK_ERROR, error); if (response.status === 404) throw new BoxError(BoxError.NOT_FOUND); // appstoreId does not exist if (response.status === 401) throw new BoxError(BoxError.INVALID_CREDENTIALS); if (response.status === 402) throw new BoxError(BoxError.LICENSE_ERROR, response.body.message); @@ -188,7 +188,7 @@ async function unpurchaseApp(appId, data) { .timeout(60 * 1000) .ok(() => true)); - if (error) throw new BoxError(BoxError.NETWORK_ERROR, error.message); + if (error) throw new BoxError(BoxError.NETWORK_ERROR, error); if (response.status === 404) return; // was never purchased if (response.status === 401) throw new BoxError(BoxError.INVALID_CREDENTIALS); if (response.status !== 200) throw new BoxError(BoxError.EXTERNAL_ERROR, `App unpurchase failed to get app. status:${response.status}`); @@ -199,7 +199,7 @@ async function unpurchaseApp(appId, data) { .timeout(60 * 1000) .ok(() => true)); - if (error) throw new BoxError(BoxError.NETWORK_ERROR, error.message); + if (error) throw new BoxError(BoxError.NETWORK_ERROR, error); if (response.status === 401) throw new BoxError(BoxError.INVALID_CREDENTIALS); if (response.status !== 204) throw new BoxError(BoxError.EXTERNAL_ERROR, `App unpurchase failed. status:${response.status}`); } @@ -221,7 +221,7 @@ async function getBoxUpdate(options) { .timeout(60 * 1000) .ok(() => true)); - if (error) throw new BoxError(BoxError.NETWORK_ERROR, error.message); + if (error) throw new BoxError(BoxError.NETWORK_ERROR, error); if (response.status === 401) throw new BoxError(BoxError.INVALID_CREDENTIALS); if (response.status === 204) return; // no update if (response.status !== 200 || !response.body) throw new BoxError(BoxError.EXTERNAL_ERROR, `Bad response: ${response.status} ${response.text}`); @@ -296,7 +296,7 @@ async function registerCloudron(data) { .timeout(60 * 1000) .ok(() => true)); - if (error) throw new BoxError(BoxError.NETWORK_ERROR, error.message); + if (error) throw new BoxError(BoxError.NETWORK_ERROR, error); if (response.status === 401) throw new BoxError(BoxError.LICENSE_ERROR, 'Setup token invalid'); if (response.status !== 201) throw new BoxError(BoxError.EXTERNAL_ERROR, `Unable to register cloudron: ${response.statusCode} ${error.message}`); @@ -402,7 +402,7 @@ async function createTicket(info, auditSource) { } const [error, response] = await safe(request); - if (error) throw new BoxError(BoxError.NETWORK_ERROR, error.message); + if (error) throw new BoxError(BoxError.NETWORK_ERROR, error); if (response.status === 401) throw new BoxError(BoxError.INVALID_CREDENTIALS); if (response.status !== 201) throw new BoxError(BoxError.EXTERNAL_ERROR, `Bad response: ${response.status} ${response.text}`); @@ -444,7 +444,7 @@ async function getApps() { .timeout(60 * 1000) .ok(() => true)); - if (error) throw new BoxError(BoxError.NETWORK_ERROR, error.message); + if (error) throw new BoxError(BoxError.NETWORK_ERROR, error); if (response.status === 403 || response.status === 401) throw new BoxError(BoxError.INVALID_CREDENTIALS); if (response.status !== 200) throw new BoxError(BoxError.EXTERNAL_ERROR, `App listing failed. ${response.status} ${JSON.stringify(response.body)}`); if (!response.body.apps) throw new BoxError(BoxError.EXTERNAL_ERROR, `Bad response: ${response.status} ${response.text}`); @@ -467,7 +467,7 @@ async function getAppVersion(appId, version) { .timeout(60 * 1000) .ok(() => true)); - if (error) throw new BoxError(BoxError.NETWORK_ERROR, error.message); + if (error) throw new BoxError(BoxError.NETWORK_ERROR, error); if (response.status === 403 || response.statusCode === 401) throw new BoxError(BoxError.INVALID_CREDENTIALS); if (response.status === 404) throw new BoxError(BoxError.NOT_FOUND); if (response.status !== 200) throw new BoxError(BoxError.EXTERNAL_ERROR, `App fetch failed. ${response.status} ${JSON.stringify(response.body)}`); diff --git a/src/boxerror.js b/src/boxerror.js index 02025c553..280ad236f 100644 --- a/src/boxerror.js +++ b/src/boxerror.js @@ -24,6 +24,11 @@ function BoxError(reason, errorOrMessage, override) { this.message = reason; } else if (typeof errorOrMessage === 'string') { this.message = errorOrMessage; + } else if (errorOrMessage instanceof AggregateError) { // + const messages = errorOrMessage.errors.map(e => e.message); + this.message = `${errorOrMessage.message} messages: ${messages.join(',')}`; + this.nestedError = errorOrMessage; + Object.assign(this, override); // copy enumerable properies } else { // error object this.message = errorOrMessage.message; this.nestedError = errorOrMessage;