/* jslint node:true */ 'use strict'; const assert = require('assert'), util = require('util'), _ = require('underscore'); exports = module.exports = BoxError; function BoxError(reason, errorOrMessage, details) { assert.strictEqual(typeof reason, 'string'); assert(errorOrMessage instanceof Error || typeof errorOrMessage === 'string' || typeof errorOrMessage === 'undefined'); assert(typeof details === 'object' || typeof details === 'undefined'); Error.call(this); Error.captureStackTrace(this, this.constructor); this.name = this.constructor.name; this.reason = reason; this.details = details || {}; if (typeof errorOrMessage === 'undefined') { this.message = reason; } else if (typeof errorOrMessage === 'string') { this.message = errorOrMessage; } else { // error object this.message = errorOrMessage.message; this.nestedError = errorOrMessage; _.extend(this.details, errorOrMessage); // copy enumerable properies } } util.inherits(BoxError, Error); BoxError.ACCESS_DENIED = 'Access Denied'; BoxError.ALREADY_EXISTS = 'Already Exists'; BoxError.BAD_FIELD = 'Bad Field'; BoxError.BAD_STATE = 'Bad State'; BoxError.BUSY = 'Busy'; BoxError.COLLECTD_ERROR = 'Collectd Error'; BoxError.CONFLICT = 'Conflict'; BoxError.DATABASE_ERROR = 'Database Error'; BoxError.DNS_ERROR = 'DNS Error'; BoxError.DOCKER_ERROR = 'Docker Error'; BoxError.EXTERNAL_ERROR = 'External Error'; // use this for external API errors BoxError.FS_ERROR = 'FileSystem Error'; BoxError.INACTIVE = 'Inactive'; BoxError.INTERNAL_ERROR = 'Internal Error'; BoxError.LICENSE_ERROR = 'License Error'; BoxError.LOGROTATE_ERROR = 'Logrotate Error'; BoxError.NETWORK_ERROR = 'Network Error'; BoxError.NGINX_ERROR = 'Nginx Error'; BoxError.NOT_FOUND = 'Not found'; BoxError.NOT_SIGNED = 'Not Signed'; BoxError.OPENSSL_ERROR = 'OpenSSL Error'; BoxError.PLAN_LIMIT = 'Plan Limit'; BoxError.TASK_ERROR = 'Task Error'; BoxError.TRY_AGAIN = 'Try Again'; BoxError.UNKNOWN_ERROR = 'Unknown Error'; // only used for porting BoxError.prototype.toPlainObject = function () { return _.extend({}, { message: this.message, reason: this.reason }, this.details); };