@ellcrys/spell
Version:
The official JavaScript library for Ellcrys
173 lines • 9.29 kB
JavaScript
;
/**
* @module RPCClient
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var jwt = require("jsonwebtoken");
var moment = require("moment");
var request_1 = __importDefault(require("request"));
var v4_1 = __importDefault(require("uuid/v4"));
var errors_1 = __importDefault(require("./errors"));
/**
* RPCClient connects to given host and port
* of an Ellcrys node.
*
* @export
* @class RPCClient
*/
var RPCClient = /** @class */ (function () {
/**
* Creates an instance of RPCClient.
*
* @param {Client} [client] The underlying JSON-RPC 2.0 client
* @memberof RPCClient
*/
function RPCClient(client) {
this.client = client;
}
/**
* Call a RPC method
*
* @param {string} method The RPC method full name
* @param {*} params The method's parameters
* @returns {Promise}
* @memberof RPCClient
*/
RPCClient.prototype.call = function (method, params) {
var _this = this;
return new Promise(function (resolve, reject) {
// We can't make any call if client has not been initiated
if (!_this.client) {
return reject(errors_1.default.ClientNotInitialized);
}
// Add bearer token to the client option if available
if (_this.token && _this.clientOpts) {
// Decode the token to check whether it has expired.
// If expired, return SessionTokenExpired error
var decoded = jwt.decode(_this.token, { complete: true });
var expUtc = moment.unix(decoded.payload.exp);
if (expUtc.isBefore(moment().utc())) {
return reject(errors_1.default.SessionTokenExpired);
}
}
// prettier-ignore
_this.client.bearerToken = _this.token;
_this.client.call(method, params, function (err, res) {
if (err) {
if (err.statusCode === 401) {
return reject(errors_1.default.AuthRequired);
}
return reject(err);
}
return resolve(res);
});
});
};
/**
* Set the session token
*
* @param {string} token
* @memberof RPCClient
*/
RPCClient.prototype.setToken = function (token) {
this.token = token;
};
return RPCClient;
}());
exports.default = RPCClient;
/**
* Client handles connection, authentication and
* invocation of methods of an RPC service
*
* @export
* @class Client
*/
var Client = /** @class */ (function () {
function Client() {
/**
* Bearer token to use
*
* @type {string}
* @memberof Client
*/
this.bearerToken = "";
}
/**
* Create a Client from the given options
*
* @static
* @param {ConnectOptions} opts
* @returns {Client}
* @memberof Client
*/
Client.fromOptions = function (opts) {
var c = new Client();
c.opts = opts;
return c;
};
/**
* Call an RPC method
*
* @param {string} method The method to be called
* @param {any} params The parameter to pass to the method
* @param {(err: any, result: any) => void} cb Callback to be invoked on success/failure
* @memberof Client
*/
Client.prototype.call = function (method, params, cb) {
var id = v4_1.default();
var obj = this.makeRequest(method, id, params);
var opts = {
uri: {
hostname: this.opts.host,
port: this.opts.port.toString(),
protocol: this.opts.https ? "https:" : "http:",
path: this.opts.path,
},
timeout: 15000,
json: obj,
};
// Use bearer token if provided
if (this.bearerToken) {
opts.auth = {
bearer: this.bearerToken,
};
}
// prettier-ignore
request_1.default.post(opts, function (err, resp, body) {
if (err) {
return cb(err, null);
}
else if (resp.statusCode !== 200) {
var msg = JSON.stringify(resp.body);
var customErr = new Error(msg);
customErr.data = msg;
customErr.statusCode = resp.statusCode;
return cb(customErr, null);
}
return cb(null, body.result);
});
};
/**
* Create JSON-RPC 2.0 request
*
* @private
* @param {string} method
* @param {string} id
* @param {*} params
* @memberof Client
*/
Client.prototype.makeRequest = function (method, id, params) {
return {
jsonrpc: "2.0",
id: id ? id : v4_1.default(),
method: method,
params: params,
};
};
return Client;
}());
exports.Client = Client;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnBjY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xpYi9ycGNjbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOzs7OztBQUVILGtDQUFxQztBQUNyQywrQkFBa0M7QUFDbEMsb0RBQThCO0FBQzlCLCtDQUE2QjtBQUU3QixvREFBOEI7QUFFOUI7Ozs7OztHQU1HO0FBQ0g7SUE2QkM7Ozs7O09BS0c7SUFDSCxtQkFBWSxNQUFnQjtRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLHdCQUFJLEdBQVgsVUFBWSxNQUFjLEVBQUUsTUFBVztRQUF2QyxpQkFrQ0M7UUFqQ0EsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO1lBQ2xDLDBEQUEwRDtZQUMxRCxJQUFJLENBQUMsS0FBSSxDQUFDLE1BQU0sRUFBRTtnQkFDakIsT0FBTyxNQUFNLENBQUMsZ0JBQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2FBQzNDO1lBRUQscURBQXFEO1lBQ3JELElBQUksS0FBSSxDQUFDLEtBQUssSUFBSSxLQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNsQyxvREFBb0Q7Z0JBQ3BELCtDQUErQztnQkFDL0MsSUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzNELElBQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUUsT0FBZSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDekQsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7b0JBQ3BDLE9BQU8sTUFBTSxDQUFDLGdCQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztpQkFDMUM7YUFD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