UNPKG

eosjs-api

Version:

Application programming interface to EOS blockchain nodes.

188 lines (154 loc) 4.99 kB
'use strict'; 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; }