fcoin/lib/http/rpcclient.js
2017-10-11 16:23:37 +04:00

102 lines
2.0 KiB
JavaScript

/*!
* rpcclient.js - json rpc client for bcoin
* Copyright (c) 2014-2017, Christopher Jeffrey (MIT License).
* https://github.com/bcoin-org/bcoin
*/
'use strict';
const Network = require('../protocol/network');
const request = require('./request');
/**
* Bcoin RPC client.
* @alias module:http.RPCClient
* @constructor
* @param {String} uri
* @param {Object?} options
*/
function RPCClient(options) {
if (!(this instanceof RPCClient))
return new RPCClient(options);
if (!options)
options = {};
if (typeof options === 'string')
options = { uri: options };
this.options = options;
this.network = Network.get(options.network);
this.uri = options.uri || `http://localhost:${this.network.rpcPort}`;
this.apiKey = options.apiKey;
this.id = 0;
}
/**
* Make a json rpc request.
* @private
* @param {String} method - RPC method name.
* @param {Array} params - RPC parameters.
* @returns {Promise} - Returns Object?.
*/
RPCClient.prototype.execute = async function execute(method, params) {
const res = await request({
method: 'POST',
uri: this.uri,
pool: true,
json: {
method: method,
params: params,
id: this.id++
},
auth: {
username: 'bitcoinrpc',
password: this.apiKey || ''
}
});
if (res.statusCode === 401)
throw new RPCError('Unauthorized (bad API key).', -1);
if (res.type !== 'json')
throw new Error('Bad response (wrong content-type).');
if (!res.body)
throw new Error('No body for JSON-RPC response.');
if (res.body.error)
throw new RPCError(res.body.error.message, res.body.error.code);
if (res.statusCode !== 200)
throw new Error(`Status code: ${res.statusCode}.`);
return res.body.result;
};
/*
* Helpers
*/
function RPCError(msg, code) {
Error.call(this);
this.type = 'RPCError';
this.message = String(msg);
this.code = code >>> 0;
if (Error.captureStackTrace)
Error.captureStackTrace(this, RPCError);
}
Object.setPrototypeOf(RPCError.prototype, Error.prototype);
/*
* Expose
*/
module.exports = RPCClient;