node-onesky-utils
Version:
Node.js utils for working with OneSky translation service. Original package from @brainly/onesky-utils
108 lines (98 loc) • 2.83 kB
JavaScript
module.exports = {
getDevHash: _getDevHash,
handleError: _handleError,
makeRequest: _makeRequest
}
var md5 = require('md5')
var axios = require('axios')
/**
* @param {String} secret
* @return {Object}
* @private
*/
function _getDevHash(secret) {
var timestamp = Math.floor(Date.now() / 1000)
return {
devHash: md5(timestamp + secret),
timestamp: timestamp
}
}
/**
* @param {String|Object} options URL to get from or object with request config
* @param {String} message Error message
* @private
*/
function _makeRequest(options, message) {
// Convert request-promise options to axios options
const axiosOptions = {
method: options.method,
url: options.url,
headers: options.headers || {},
params: options.qs,
};
// Handle data differently based on type
if (options.data) {
// If data is already provided (from our form-data implementation)
axiosOptions.data = options.data;
} else if (options.formData) {
// Legacy formData support
axiosOptions.data = options.formData;
} else if (options.body) {
// Handle body if provided
axiosOptions.data = options.body;
}
if (options.json) {
axiosOptions.responseType = 'json';
}
return axios(axiosOptions)
.then(response => {
// Handle cases where request-promise might have returned the body directly
if (options.json && response.data) {
return response.data;
}
return response.data;
})
.catch(error => {
// Adapt error handling to match the previous structure if possible
const customError = {
message: message,
code: error.response ? error.response.status : 500,
details: error.response ? error.response.data : error.message
};
return _handleError(message, { response: { body: JSON.stringify(customError.details || {}) } });
});
}
/**
* @param {Object} data
* @private
*/
function _handleError(message, data) {
var error = {}
return new Promise(function (resolve, reject) {
try {
var content = JSON.parse(data.response.body)
if (content.meta) {
error.message = content.meta.message
error.code = content.meta.status
} else if (content.message && content.code) {
// Check if content has message and code (axios error structure)
error.message = content.message
error.code = content.code
} else {
error.message = message // Fallback message
error.code =
data.response && data.response.statusCode
? data.response.statusCode
: 500
}
} catch (e) {
error.message = message
error.code =
data.response && data.response.statusCode
? data.response.statusCode
: 500
}
reject(error)
})
}