dashboard/shell/utils/error.js

132 lines
2.6 KiB
JavaScript

import { isArray } from '@shell/utils/array';
export class ClusterNotFoundError extends Error {
static NAME = 'ClusterNotFoundError'
constructor(message) {
super(message);
this.name = ClusterNotFoundError.NAME;
}
}
/**
* An error occurred and the user should be redirected to a certain location (where this is handled)
*/
export class RedirectToError extends Error {
static NAME = 'RedirectToError'
constructor(message, url) {
super(message);
this.url = url;
this.name = RedirectToError.NAME;
}
}
export class ApiError extends Error {
constructor(res) {
super(stringify(res));
this.status = res._status || 0;
this.statusText = res._statusText;
this.headers = res.headers;
this.url = res._url;
}
toString() {
return `[${ this.status } ${ this.statusText }]: ${ this.message }`;
}
toJSON() {
return {
type: 'error',
status: this.status,
statusText: this.statusText,
message: this.statusMessage,
url: this.url,
};
}
}
export function stringify(err) {
let str;
if ( typeof err === 'string' ) {
str = err;
} else if ( err && typeof err === 'object' ) {
if ( err.message ) {
str = err.message;
if (typeof str === 'string') {
try {
const data = JSON.parse(str).data;
if (data) {
return data;
}
} catch {}
}
if ( err.detail ) {
if ( str ) {
str += ` (${ err.detail })`;
} else {
str = err.detail;
}
}
} else if ( err.detail ) {
str = err.detail;
} else if ( err.url ) {
str = `from ${ err.url }`;
}
}
if (!str) {
// Good luck...
str = JSON.stringify(err);
}
return str;
}
export function exceptionToErrorsArray(err) {
if ( err?.response?.data ) {
const body = err.response.data;
if ( body && body.message ) {
return [body.message];
} else {
return [err];
}
} else if (err.status && err.message) {
return [err.message];
} else if ( isArray(err) ) {
return err;
} else {
return [err];
}
}
/**
* Imported from path-to-regexp
* @param {*} err
* @returns
*/
export const normalizeError = (err) => {
let message;
if (!(err.message || typeof err === 'string')) {
try {
message = JSON.stringify(err, null, 2);
} catch (e) {
message = `[${ err.constructor.name }]`;
}
} else {
message = err.message || err;
}
return {
...err,
message,
statusCode: (err.statusCode || err.status || (err.response && err.response.status) || 500)
};
};