2021-12-03 17:58:48 +01:00

89 lines
2.6 KiB
JavaScript

'use strict';
var _ = require('lodash');
var assert = require('assert-plus');
var nerror = require('@netflix/nerror');
var bunyanSerializer = require('./serializer');
var helpers = require('./helpers');
var HttpError = require('./baseClasses/HttpError');
var RestError = require('./baseClasses/RestError');
var httpErrors = require('./httpErrors');
var restErrors = require('./restErrors');
var makeConstructor = require('./makeConstructor');
/**
* create an error object from an http status code.
* first arg is status code, all subsequent args
* passed on to the constructor. only works for regular
* HttpErrors, not RestErrors.
* @public
* @function makeErrFromCode
* @param {Number} statusCode the http status code
* @returns {Error} an error instance
*/
function makeErrFromCode(statusCode) {
// assert!
assert.number(statusCode, 'statusCode');
assert.equal(statusCode >= 400, true);
// drop the first arg
var args = _.drop(_.toArray(arguments));
var name = helpers.errNameFromCode(statusCode);
var ErrCtor = httpErrors[name];
// assert constructor was found
assert.func(ErrCtor);
// pass every other arg down to constructor
return makeInstance(ErrCtor, makeErrFromCode, args);
}
/**
* helper function to dynamically apply args
* to a dynamic constructor. magicks.
* @private
* @function makeInstance
* @param {Function} constructor the constructor function
* @param {Function} constructorOpt where to start the error stack trace
* @param {Array} args array of arguments to apply to ctor
* @returns {Object} instance of the ctor
*/
function makeInstance(constructor, constructorOpt, args) {
// pass args to the constructor
function F() { // eslint-disable-line require-jsdoc
return constructor.apply(this, args);
}
F.prototype = constructor.prototype;
// new up an instance, and capture stack trace from the
// passed in constructorOpt
var errInstance = new F();
Error.captureStackTrace(errInstance, constructorOpt);
// return the error instance
return errInstance;
}
module.exports = _.assign({}, httpErrors, restErrors, nerror, {
// export base classes
HttpError: HttpError,
RestError: RestError,
// export convenience functions
makeConstructor: makeConstructor,
makeErrFromCode: makeErrFromCode,
// deprecated method names, how long do we keep these for?
// restify has already been updated, but what about external consumers?
codeToHttpError: makeErrFromCode,
// built in bunyan serializer
bunyanSerializer: bunyanSerializer
});