2019-09-05 17:13:07 -07:00
|
|
|
/* jslint node:true */
|
|
|
|
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
|
const assert = require('assert'),
|
2019-10-24 18:05:14 -07:00
|
|
|
HttpError = require('connect-lastmile').HttpError,
|
2023-05-25 11:27:23 +02:00
|
|
|
util = require('util');
|
2019-09-05 17:13:07 -07:00
|
|
|
|
|
|
|
|
exports = module.exports = BoxError;
|
|
|
|
|
|
2021-05-11 17:50:22 -07:00
|
|
|
function BoxError(reason, errorOrMessage, override) {
|
2019-09-05 17:13:07 -07:00
|
|
|
assert.strictEqual(typeof reason, 'string');
|
|
|
|
|
assert(errorOrMessage instanceof Error || typeof errorOrMessage === 'string' || typeof errorOrMessage === 'undefined');
|
2021-05-11 17:50:22 -07:00
|
|
|
assert(typeof override === 'object' || typeof override === 'undefined');
|
2019-09-05 17:13:07 -07:00
|
|
|
|
|
|
|
|
Error.call(this);
|
|
|
|
|
Error.captureStackTrace(this, this.constructor);
|
|
|
|
|
|
|
|
|
|
this.name = this.constructor.name;
|
|
|
|
|
this.reason = reason;
|
2021-05-11 17:50:22 -07:00
|
|
|
this.details = {};
|
2019-09-23 23:27:32 -07:00
|
|
|
|
2019-09-05 17:13:07 -07:00
|
|
|
if (typeof errorOrMessage === 'undefined') {
|
|
|
|
|
this.message = reason;
|
|
|
|
|
} else if (typeof errorOrMessage === 'string') {
|
|
|
|
|
this.message = errorOrMessage;
|
2019-09-23 23:27:32 -07:00
|
|
|
} else { // error object
|
|
|
|
|
this.message = errorOrMessage.message;
|
2019-09-05 17:13:07 -07:00
|
|
|
this.nestedError = errorOrMessage;
|
2023-05-25 11:27:23 +02:00
|
|
|
Object.assign(this, override); // copy enumerable properies
|
2019-09-05 17:13:07 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
util.inherits(BoxError, Error);
|
|
|
|
|
BoxError.ACCESS_DENIED = 'Access Denied';
|
2021-11-17 10:54:26 -08:00
|
|
|
BoxError.ACME_ERROR = 'Acme Error';
|
2019-12-04 13:17:58 -08:00
|
|
|
BoxError.ADDONS_ERROR = 'Addons Error';
|
2019-09-05 17:13:07 -07:00
|
|
|
BoxError.ALREADY_EXISTS = 'Already Exists';
|
|
|
|
|
BoxError.BAD_FIELD = 'Bad Field';
|
2019-10-22 20:12:44 -07:00
|
|
|
BoxError.BAD_STATE = 'Bad State';
|
2019-10-23 10:02:04 -07:00
|
|
|
BoxError.BUSY = 'Busy';
|
2019-09-06 11:19:58 -07:00
|
|
|
BoxError.COLLECTD_ERROR = 'Collectd Error';
|
2019-09-05 17:13:07 -07:00
|
|
|
BoxError.CONFLICT = 'Conflict';
|
2019-10-24 14:40:26 -07:00
|
|
|
BoxError.CRYPTO_ERROR = 'Crypto Error';
|
2019-09-06 11:19:58 -07:00
|
|
|
BoxError.DATABASE_ERROR = 'Database Error';
|
|
|
|
|
BoxError.DNS_ERROR = 'DNS Error';
|
|
|
|
|
BoxError.DOCKER_ERROR = 'Docker Error';
|
2019-10-23 09:39:26 -07:00
|
|
|
BoxError.EXTERNAL_ERROR = 'External Error'; // use this for external API errors
|
2020-02-05 11:58:10 -08:00
|
|
|
BoxError.FEATURE_DISABLED = 'Feature Disabled';
|
2019-09-06 11:19:58 -07:00
|
|
|
BoxError.FS_ERROR = 'FileSystem Error';
|
2021-05-19 09:50:50 -07:00
|
|
|
BoxError.INACTIVE = 'Inactive'; // service/volume/mount
|
2019-09-05 17:13:07 -07:00
|
|
|
BoxError.INTERNAL_ERROR = 'Internal Error';
|
2019-10-24 13:41:41 -07:00
|
|
|
BoxError.INVALID_CREDENTIALS = 'Invalid Credentials';
|
2020-08-31 18:22:33 -07:00
|
|
|
BoxError.IPTABLES_ERROR = 'IPTables Error';
|
2022-03-31 22:50:55 -07:00
|
|
|
BoxError.LICENSE_ERROR = 'License Error'; // billing or subscription expired
|
2019-09-06 11:19:58 -07:00
|
|
|
BoxError.LOGROTATE_ERROR = 'Logrotate Error';
|
2019-11-05 19:54:53 -08:00
|
|
|
BoxError.MAIL_ERROR = 'Mail Error';
|
2021-05-19 09:50:50 -07:00
|
|
|
BoxError.MOUNT_ERROR = 'Mount Error';
|
2019-09-06 11:19:58 -07:00
|
|
|
BoxError.NETWORK_ERROR = 'Network Error';
|
2019-10-22 16:46:24 -07:00
|
|
|
BoxError.NGINX_ERROR = 'Nginx Error';
|
2019-09-05 17:13:07 -07:00
|
|
|
BoxError.NOT_FOUND = 'Not found';
|
2019-10-24 18:40:37 -07:00
|
|
|
BoxError.NOT_IMPLEMENTED = 'Not implemented';
|
2019-10-23 09:39:26 -07:00
|
|
|
BoxError.NOT_SIGNED = 'Not Signed';
|
2021-10-11 15:51:16 +02:00
|
|
|
BoxError.NOT_SUPPORTED = 'Not Supported';
|
2019-09-25 14:13:10 -07:00
|
|
|
BoxError.OPENSSL_ERROR = 'OpenSSL Error';
|
2019-10-24 10:39:47 -07:00
|
|
|
BoxError.PLAN_LIMIT = 'Plan Limit';
|
2024-02-20 23:09:49 +01:00
|
|
|
BoxError.SHELL_ERROR = 'Shell Error'; // exec or spawn cmd failed
|
2019-09-19 23:13:04 -07:00
|
|
|
BoxError.TASK_ERROR = 'Task Error';
|
2019-12-04 10:29:06 -08:00
|
|
|
BoxError.TIMEOUT = 'Timeout';
|
2019-09-25 14:13:10 -07:00
|
|
|
BoxError.TRY_AGAIN = 'Try Again';
|
2019-09-05 21:10:55 -07:00
|
|
|
|
|
|
|
|
BoxError.prototype.toPlainObject = function () {
|
2023-05-25 11:27:23 +02:00
|
|
|
return Object.assign({}, { message: this.message, reason: this.reason }, this.details);
|
2019-09-05 21:10:55 -07:00
|
|
|
};
|
2019-10-24 13:34:14 -07:00
|
|
|
|
2019-10-24 18:05:14 -07:00
|
|
|
// this is a class method for now in case error is not a BoxError
|
|
|
|
|
BoxError.toHttpError = function (error) {
|
|
|
|
|
switch (error.reason) {
|
|
|
|
|
case BoxError.BAD_FIELD:
|
|
|
|
|
return new HttpError(400, error);
|
|
|
|
|
case BoxError.LICENSE_ERROR:
|
|
|
|
|
return new HttpError(402, error);
|
|
|
|
|
case BoxError.NOT_FOUND:
|
|
|
|
|
return new HttpError(404, error);
|
2020-02-05 11:58:10 -08:00
|
|
|
case BoxError.FEATURE_DISABLED:
|
|
|
|
|
return new HttpError(405, error);
|
2019-10-24 18:05:14 -07:00
|
|
|
case BoxError.ALREADY_EXISTS:
|
|
|
|
|
case BoxError.BAD_STATE:
|
|
|
|
|
case BoxError.CONFLICT:
|
2021-10-11 15:51:16 +02:00
|
|
|
case BoxError.NOT_SUPPORTED:
|
2019-10-24 18:05:14 -07:00
|
|
|
return new HttpError(409, error);
|
|
|
|
|
case BoxError.INVALID_CREDENTIALS:
|
|
|
|
|
return new HttpError(412, error);
|
|
|
|
|
case BoxError.EXTERNAL_ERROR:
|
2021-11-17 10:54:26 -08:00
|
|
|
case BoxError.ACME_ERROR:
|
2019-10-24 18:05:14 -07:00
|
|
|
case BoxError.NETWORK_ERROR:
|
|
|
|
|
case BoxError.FS_ERROR:
|
2021-05-19 09:50:50 -07:00
|
|
|
case BoxError.MOUNT_ERROR:
|
2019-11-05 20:55:21 -08:00
|
|
|
case BoxError.MAIL_ERROR:
|
|
|
|
|
case BoxError.DOCKER_ERROR:
|
2019-12-05 09:54:29 -08:00
|
|
|
case BoxError.ADDONS_ERROR:
|
2020-08-31 18:22:33 -07:00
|
|
|
case BoxError.IPTABLES_ERROR:
|
2019-10-24 18:05:14 -07:00
|
|
|
return new HttpError(424, error);
|
|
|
|
|
case BoxError.DATABASE_ERROR:
|
|
|
|
|
case BoxError.INTERNAL_ERROR:
|
|
|
|
|
default:
|
|
|
|
|
return new HttpError(500, error);
|
|
|
|
|
}
|
|
|
|
|
};
|