test-openapi
Version:
Automated client requests
59 lines (45 loc) • 1.53 kB
JavaScript
const { keepProps } = require('../utils')
// Wrap a function with a error handler
// Allow passing an empty error handler, i.e. ignoring any error thrown
// eslint-disable-next-line no-empty-function
const addErrorHandler = function(func, errorHandler = () => {}) {
return errorHandledFunc.bind(null, func, errorHandler)
}
const kAddErrorHandler = keepProps(addErrorHandler)
const errorHandledFunc = function(func, errorHandler, ...args) {
try {
const retVal = func(...args)
// Works for async functions as well
// eslint-disable-next-line promise/prefer-await-to-then
return retVal && typeof retVal.then === 'function'
? retVal.catch(error => handleError({ func, errorHandler, error, args }))
: retVal
} catch (error) {
return handleError({ func, errorHandler, error, args })
}
}
const handleError = function({ func, errorHandler, error, args }) {
const errorA = normalizeError(func, error)
return errorHandler(errorA, ...args)
}
// Make sure thrown objects are Errors
const normalizeError = function(func, error) {
if (error instanceof Error) {
return error
}
const errorA = new Error(error)
addStack(errorA)
return errorA
}
// Remove error handling logic from stack trace
const addStack = function(error) {
const obj = {}
Error.captureStackTrace(obj, errorHandledFunc)
const { stack } = obj
// eslint-disable-next-line fp/no-mutation, no-param-reassign
error.stack = stack
}
module.exports = {
addErrorHandler: kAddErrorHandler,
}