binaris
Version:
Binaris SDK & CLI
76 lines (62 loc) • 2.01 kB
JavaScript
;
const get = require('lodash.get');
const { inspect } = require('util');
const rp = require('request-promise-native');
const logger = require('../lib/logger');
const { maybeTranslateErrorCode } = require('binaris-pickle');
const { version } = require('../package.json');
class APIError extends Error {
constructor(message, requestId) {
const requestIdString = requestId ? `RequestId: ${requestId}\n` : '';
super(`${requestIdString}${message}`);
}
}
function validateResponse(response) {
const requestId = get(response, 'headers.x-binaris-request-id');
const errorCode = get(response, 'body.errorCode');
if (errorCode) {
const readableErrorMessage = maybeTranslateErrorCode(errorCode);
if (readableErrorMessage) {
throw new APIError(`Error: ${readableErrorMessage}`, requestId);
}
}
// An error is anything with an error message, or any error code
// with an untranslated message.
const errorText = get(response, 'body.error') || (errorCode && get(response, 'body.message'));
if (errorText) {
throw new APIError(errorText, requestId);
}
if (errorCode) {
throw new APIError(`Error: ${errorCode}`, requestId);
}
if (response.statusCode < 200 || response.statusCode >= 300) {
throw new APIError(`Unexpected response ${response.statusCode}`, requestId);
}
return response;
}
async function loggedRequest(options, type = 'post') {
const response = await rp[type]({
json: true,
simple: false,
resolveWithFullResponse: true,
...options,
headers: {
...(options.headers || {}),
'X-Binaris-Client-Version': version,
},
family: 4,
});
logger.debug('raw response', inspect(response, { depth: null }));
return response;
}
async function getValidatedBody(options, type = 'post') {
const response = await loggedRequest(options, type);
return validateResponse(response).body;
}
module.exports = {
APIError,
getValidatedBody,
loggedRequest,
validateResponse,
version,
};