@twreporter/universal-header
Version:
Universal header of TWReporter sites
148 lines (141 loc) • 4.74 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _get = _interopRequireDefault(require("lodash/get"));
var _merge = _interopRequireDefault(require("lodash/merge"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } // lodash
var _ = {
get: _get["default"],
merge: _merge["default"]
};
/**
* Refine Axios config to remain the infomative properties.
* @param {Object} axiosConfig - config provied by Axios
* @return {Object} - empty object or the object containing the following properties
* 'url',
* 'method' ,
* 'baseURL',
* 'headers',
* 'params',
* 'timeout',
* 'withCredentials',
* 'auth',
* 'responseType',
* 'responseEncoding',
* 'maxContentLength',
* 'proxy'
*
* For other removed properties,
* see https://github.com/axios/axios#request-config
*/
function refineAxiosConfig(axiosConfig) {
if (_typeof(axiosConfig) === 'object' && axiosConfig !== null) {
return {
// request url
url: axiosConfig.url,
// requst method
method: axiosConfig.method,
// request baseURL
baseURL: axiosConfig.baseURL,
// request headers
headers: axiosConfig.headers,
// request query params
params: axiosConfig.params,
// request data
data: axiosConfig.data,
// request timeout
timeout: axiosConfig.timeout,
withCredentials: axiosConfig.withCredentials,
auth: axiosConfig.auth,
responseType: axiosConfig.responseType,
responseEncoding: axiosConfig.responseEncoding,
maxContentLength: axiosConfig.maxContentLength,
proxy: axiosConfig.proxy
};
}
return {};
}
/**
* Axios Error object
* @typedef {Error} AxiosError
* @property {Function} toJSON
* @property {Object} config - Axios config
* @property {Object} request - Axios request
* @property {Object} response- Axios response
* @property {bool} isAxiosError
* @property {string} message - Error message
* @property {string} stack - Error stack
*/
/**
* Refined Axios error object type definition
* We only pick certain properties of Axios error to log
* because of the record size limitation (250kb) of
* Stackdriver logging system.
* @typedef {Error} RefinedAxiosError
* @property {Object} config - Refined Axios config object
* @property {Object} data - Server response body
* @property {Object} headers - Server response headers
* @property {number} statusCode - Response status code
* @property {string} message - Error message
* @property {string} name - Error name
*/
/**
* Error rejected from Axios contains many details
* which we might not need.
* Therefore, we need to remove those properties
* to maintain a neat and informative object.
*
* @param {AxiosError} err - Axios Error object
* @return {RefinedAxiosError}
*/
function refineAxiosError(err) {
var config = refineAxiosConfig(_.get(err, 'config'));
var data = null;
var statusCode = 500; // internal server error
var headers = null;
var message = _.get(err, 'message');
if (err.response) {
data = _.get(err, 'response.data');
statusCode = _.get(err, 'response.status');
headers = _.get(err, 'response.headers');
} else if (err.request) {
message = 'A request was made but no response was received: ' + message;
} else {
message = 'An error occured when setting up the request: ' + message;
}
var refinedErr = new Error(message);
refinedErr.name = 'AxiosError';
refinedErr.data = data;
refinedErr.statusCode = statusCode;
refinedErr.headers = headers;
refinedErr.config = config;
return refinedErr;
}
/**
* error action type definition
* @typedef {Object} ErrorAction
* @property {string} type - Action error type
* @property {RefinedAxiosError} payload
*/
/**
* Create an action which carefully records the details about the error.
* @param {AxiosError} [err={}] - Axios Error
* @param {string} failActionType
* @returns {ErrorAction}
*/
function createAxiosErrorAction() {
var err = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var failActionType = arguments.length > 1 ? arguments[1] : undefined;
return {
type: failActionType,
payload: {
error: refineAxiosError(err)
}
};
}
var _default = exports["default"] = {
axios: createAxiosErrorAction
};