wehelpjs
Version:
wehelpjs is the JavaScript API Library for the WeYouMe blockchain
119 lines (90 loc) • 4.36 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _bluebird = _interopRequireDefault(require("bluebird"));
var _debug = _interopRequireDefault(require("debug"));
var _helpers = _interopRequireDefault(require("./helpers"));
var _formatter = _interopRequireDefault(require("../formatter"));
var _operations = _interopRequireDefault(require("./operations"));
var _api = _interopRequireDefault(require("../api"));
var _auth = _interopRequireDefault(require("../auth"));
var _utils = require("../utils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const debug = (0, _debug.default)('api:broadcast');
const noop = function () {};
const formatter = (0, _formatter.default)(_api.default);
const apiBroadcast = {}; // Base transaction logic -----------------------------------------------------
/**
* Sign and broadcast transactions on a Protocol Specific Network
*/
apiBroadcast.send = function apiBroadcast$send(tx, privKeys, callback) {
const resultP = apiBroadcast._prepareTransaction(tx).then(transaction => {
debug('Signing transaction (transaction, transaction.operations)', transaction, transaction.operations);
return _bluebird.default.join(transaction, _auth.default.signTransaction(transaction, privKeys));
}).spread((transaction, signedTransaction) => {
debug('Broadcasting transaction (transaction, transaction.operations)', transaction, transaction.operations);
return _api.default.broadcastTransactionSynchronousAsync(signedTransaction).then(result => {
return Object.assign({}, result, signedTransaction);
});
});
resultP.nodeify(callback || noop);
};
apiBroadcast._prepareTransaction = function apiBroadcast$_prepareTransaction(tx) {
const propertiesP = _api.default.getDynamicGlobalPropertiesAsync();
return propertiesP.then(properties => {
// Set defaults on the transaction
const chainDate = new Date(properties.time + 'Z');
const refBlockNum = properties.last_irreversible_block_num - 1 & 0xFFFF;
return _api.default.getBlockAsync(properties.last_irreversible_block_num).then(block => {
const headBlockId = block.previous;
return Object.assign({
ref_block_num: refBlockNum,
ref_block_prefix: new Buffer(headBlockId, 'hex').readUInt32LE(4),
expiration: new Date(chainDate.getTime() + 600 * 1000)
}, tx);
});
});
}; // Generated wrapper ----------------------------------------------------------
// Generate operations from operations.json
_operations.default.forEach(operation => {
const operationName = (0, _utils.camelCase)(operation.operation);
const operationParams = operation.params || [];
const useCommentPermlink = operationParams.indexOf('parent_permlink') !== -1 && operationParams.indexOf('parent_permlink') !== -1;
apiBroadcast[`${operationName}With`] = function apiBroadcast$specializedSendWith(wif, options, callback) {
debug(`Sending operation "${operationName}" with`, {
options,
callback
});
const keys = {};
if (operation.roles && operation.roles.length) {
keys[operation.roles[0]] = wif; // TODO - Automatically pick a role? Send all?
}
return apiBroadcast.send({
extensions: [],
operations: [[operation.operation, Object.assign({}, options, options.json != null ? {
json: toString(options.json)
} : {}, useCommentPermlink && options.permlink == null ? {
permlink: formatter.commentPermlink(options.parent_author, options.parent_permlink)
} : {})]]
}, keys, callback);
};
apiBroadcast[operationName] = function apiBroadcast$specializedSend(wif, ...args) {
debug(`Parsing operation "${operationName}" with`, {
args
});
const options = operationParams.reduce((memo, param, i) => {
memo[param] = args[i]; // eslint-disable-line no-param-reassign
return memo;
}, {});
const callback = args[operationParams.length];
return apiBroadcast[`${operationName}With`](wif, options, callback);
};
});
const toString = obj => typeof obj === 'object' ? JSON.stringify(obj) : obj;
(0, _helpers.default)(apiBroadcast);
_bluebird.default.promisifyAll(apiBroadcast);
exports = module.exports = apiBroadcast;
var _default = apiBroadcast;
exports.default = _default;