eosjs-api
Version:
Application programming interface to EOS blockchain nodes.
188 lines (154 loc) • 4.99 kB
JavaScript
;
require('isomorphic-fetch');
var camelCase = require('camel-case');
var helpers = require('./exported-helpers');
var processArgs = require('./process-args');
module.exports = apiGen;
function apiGen(version, definitions) {
var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var configDefaults = {
httpEndpoint: 'http://127.0.0.1:8888',
verbose: false,
logger: {
log: function log() {
var _console;
return config.verbose ? (_console = console).log.apply(_console, arguments) : null;
},
error: function error() {
var _console2;
return config.verbose ? (_console2 = console).error.apply(_console2, arguments) : null;
}
}
};
function applyDefaults(target, defaults) {
Object.keys(defaults).forEach(function (key) {
if (target[key] === undefined) {
target[key] = defaults[key];
}
});
}
applyDefaults(config, configDefaults);
applyDefaults(config.logger, configDefaults.logger);
var api = {};
var httpEndpoint = config.httpEndpoint;
for (var apiGroup in definitions) {
for (var apiMethod in definitions[apiGroup]) {
var methodName = camelCase(apiMethod);
var url = httpEndpoint + '/' + version + '/' + apiGroup + '/' + apiMethod;
api[methodName] = fetchMethod(methodName, url, definitions[apiGroup][apiMethod], config);
}
}
var _loop = function _loop(helper) {
// Insert `api` as the first parameter to all API helpers
api[helper] = function () {
var _helpers$api;
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return (_helpers$api = helpers.api)[helper].apply(_helpers$api, [api].concat(args));
};
};
for (var helper in helpers.api) {
_loop(helper);
}
return api;
}
function fetchMethod(methodName, url, definition, config) {
var logger = config.logger;
return function () {
for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
if (args.length === 0) {
console.log(usage(methodName, definition));
return;
}
var optionsFormatter = function optionsFormatter(option) {
if (typeof option === 'boolean') {
return { broadcast: option };
}
};
var processedArgs = processArgs(args, Object.keys(definition.params || []), methodName, optionsFormatter);
var params = processedArgs.params,
options = processedArgs.options,
returnPromise = processedArgs.returnPromise;
var callback = processedArgs.callback;
var body = JSON.stringify(params);
if (logger.log) {
logger.log('api >', 'post', '\t', url, body);
}
var fetchConfiguration = { body: body, method: 'POST' };
Object.assign(fetchConfiguration, config.fetchConfiguration);
fetch(url, fetchConfiguration).then(function (response) {
if (response.status >= 200 && response.status < 300) {
return response.json();
} else {
return response.text().then(function (bodyResp) {
var error = new Error(bodyResp);
error.status = response.status;
error.statusText = response.statusText;
throw error;
});
}
}).then(function (objectResp) {
if (logger.log) {
logger.log('api <', 'response', '\t', url, JSON.stringify(objectResp));
}
try {
callback(null, objectResp);
} catch (callbackError) {
if (logger.error) {
logger.error('api <', 'result callback', ':', callbackError);
}
}
}).catch(function (error) {
var message = '';
try {
// nodeos format (fail safe)
message = JSON.parse(error.message).error.details[0];
} catch (e2) {}
if (logger.error) {
logger.error('api <', 'error', '\t', message, url, body);
logger.error(error);
}
try {
callback(error);
} catch (callbackError) {
if (logger.error) {
logger.error('api <', 'error callback', ':', callbackError);
}
}
});
return returnPromise;
};
}
function usage(methodName, definition) {
var usage = '';
var out = function out(str) {
usage += str + '\n';
};
out('USAGE');
out(methodName + ' - ' + definition.brief);
out('\nPARAMETERS');
if (definition.params) {
out(JSON.stringify(definition.params, null, 2));
} else {
out('none');
}
out('\nRETURNS');
if (definition.results) {
out('' + JSON.stringify(definition.results, null, 2));
} else {
out('no data');
}
out('\nERRORS');
if (definition.errors) {
for (var error in definition.errors) {
var errorDesc = definition.errors[error];
out('' + error + (errorDesc ? ' - ' + errorDesc : ''));
}
} else {
out('nothing special');
}
return usage;
}