mirror of
https://github.com/Xahau/xahau.js.git
synced 2025-11-20 12:15:51 +00:00
Use streaming pathfinding: rippled path_find instead of ripple_path_find
This commit is contained in:
@@ -46,7 +46,7 @@ function requestPathFind(remote, pathfind: PathFind, callback) {
|
|||||||
_.omit(utils.common.toRippledAmount(amount), 'value'));
|
_.omit(utils.common.toRippledAmount(amount), 'value'));
|
||||||
}
|
}
|
||||||
|
|
||||||
remote.requestRipplePathFind(params,
|
remote.createPathFind(params,
|
||||||
composeAsync(_.partial(addParams, params), callback));
|
composeAsync(_.partial(addParams, params), callback));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,8 @@ PathFind.prototype.create = function() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
PathFind.prototype.close = function() {
|
PathFind.prototype.close = function() {
|
||||||
this.remote.request_path_find_close().broadcast().request();
|
this.removeAllListeners('update');
|
||||||
|
this.remote.requestPathFindClose().broadcast().request();
|
||||||
this.emit('end');
|
this.emit('end');
|
||||||
this.emit('close');
|
this.emit('close');
|
||||||
};
|
};
|
||||||
@@ -73,7 +74,7 @@ PathFind.prototype.notify_update = function(message) {
|
|||||||
// looking for.
|
// looking for.
|
||||||
if (this.src_account === src_account &&
|
if (this.src_account === src_account &&
|
||||||
this.dst_account === dst_account &&
|
this.dst_account === dst_account &&
|
||||||
this.dst_amount.equals(dst_amount)) {
|
dst_amount.equals(this.dst_amount)) {
|
||||||
this.emit('update', message);
|
this.emit('update', message);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ function Remote(options = {}) {
|
|||||||
this._transaction_listeners = 0;
|
this._transaction_listeners = 0;
|
||||||
this._received_tx = new LRU({max: 100});
|
this._received_tx = new LRU({max: 100});
|
||||||
this._cur_path_find = null;
|
this._cur_path_find = null;
|
||||||
|
this._queued_path_finds = [];
|
||||||
|
|
||||||
if (this.local_signing) {
|
if (this.local_signing) {
|
||||||
// Local signing implies local fees and sequences
|
// Local signing implies local fees and sequences
|
||||||
@@ -1934,9 +1935,14 @@ Remote.prototype.findAccount = function(accountID) {
|
|||||||
* @return {PathFind}
|
* @return {PathFind}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
function createPathFind(options_) {
|
function createPathFind(options_, callback) {
|
||||||
const options = {};
|
const options = {};
|
||||||
|
|
||||||
|
if (this._cur_path_find !== null) {
|
||||||
|
this._queued_path_finds.push({options: options_, callback: callback});
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
if (_.isPlainObject(options_)) {
|
if (_.isPlainObject(options_)) {
|
||||||
_.merge(options, options_);
|
_.merge(options, options_);
|
||||||
} else {
|
} else {
|
||||||
@@ -1955,10 +1961,21 @@ function createPathFind(options_) {
|
|||||||
this._cur_path_find.notify_superceded();
|
this._cur_path_find.notify_superceded();
|
||||||
}
|
}
|
||||||
|
|
||||||
pathFind.create();
|
if (callback) {
|
||||||
|
pathFind.on('update', (data) => {
|
||||||
|
if (data.full_reply) {
|
||||||
|
pathFind.close();
|
||||||
|
callback(null, data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
pathFind.on('error', (error) => {
|
||||||
|
pathFind.close();
|
||||||
|
callback(error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
this._cur_path_find = pathFind;
|
this._cur_path_find = pathFind;
|
||||||
|
pathFind.create();
|
||||||
return pathFind;
|
return pathFind;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2369,6 +2386,11 @@ Remote.prototype.requestPathFindClose = function(callback) {
|
|||||||
|
|
||||||
request.message.subcommand = 'close';
|
request.message.subcommand = 'close';
|
||||||
request.callback(callback);
|
request.callback(callback);
|
||||||
|
this._cur_path_find = null;
|
||||||
|
if (this._queued_path_finds.length > 0) {
|
||||||
|
const pathfind = this._queued_path_finds.shift();
|
||||||
|
this.createPathFind(pathfind.options, pathfind.callback);
|
||||||
|
}
|
||||||
|
|
||||||
return request;
|
return request;
|
||||||
};
|
};
|
||||||
|
|||||||
8
test/fixtures/api/rippled/index.js
vendored
8
test/fixtures/api/rippled/index.js
vendored
@@ -16,10 +16,10 @@ module.exports = {
|
|||||||
book_offers: require('./book-offers'),
|
book_offers: require('./book-offers'),
|
||||||
server_info: require('./server-info'),
|
server_info: require('./server-info'),
|
||||||
server_info_error: require('./server-info-error'),
|
server_info_error: require('./server-info-error'),
|
||||||
ripple_path_find: {
|
path_find: {
|
||||||
generate: require('./ripple-path-find'),
|
generate: require('./path-find'),
|
||||||
sendUSD: require('./ripple-path-find-send-usd'),
|
sendUSD: require('./path-find-send-usd'),
|
||||||
XrpToXrp: require('./ripple-path-find-xrp-to-xrp')
|
XrpToXrp: require('./path-find-xrp-to-xrp')
|
||||||
},
|
},
|
||||||
tx: {
|
tx: {
|
||||||
Payment: require('./tx/payment.json'),
|
Payment: require('./tx/payment.json'),
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"id": 0,
|
"id": 0,
|
||||||
"result": {
|
"result": {
|
||||||
|
"full_reply": true,
|
||||||
"alternatives": [
|
"alternatives": [
|
||||||
{
|
{
|
||||||
"paths_canonical": [],
|
"paths_canonical": [],
|
||||||
@@ -72,6 +73,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"source_account": "rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo",
|
||||||
|
"destination_amount": {
|
||||||
|
"currency": "USD",
|
||||||
|
"value": "0.000001",
|
||||||
|
"issuer": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59"
|
||||||
|
},
|
||||||
"destination_account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59",
|
"destination_account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59",
|
||||||
"destination_currencies": [
|
"destination_currencies": [
|
||||||
"JOE",
|
"JOE",
|
||||||
@@ -1,7 +1,10 @@
|
|||||||
{
|
{
|
||||||
"id": 1,
|
"id": 1,
|
||||||
"result": {
|
"result": {
|
||||||
|
"full_reply": true,
|
||||||
"alternatives": [],
|
"alternatives": [],
|
||||||
|
"source_account": "rwBYyfufTzk77zUSKEu4MvixfarC35av1J",
|
||||||
|
"destination_amount": "2",
|
||||||
"destination_account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59",
|
"destination_account": "r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59",
|
||||||
"destination_currencies": [
|
"destination_currencies": [
|
||||||
"JOE",
|
"JOE",
|
||||||
@@ -7,6 +7,9 @@ function(request_id, sendingAccount, destinationAccount, destinationAmount) {
|
|||||||
'status': 'success',
|
'status': 'success',
|
||||||
'type': 'response',
|
'type': 'response',
|
||||||
'result': {
|
'result': {
|
||||||
|
'full_reply': true,
|
||||||
|
'source_account': sendingAccount,
|
||||||
|
'destination_amount': destinationAmount,
|
||||||
'alternatives': [
|
'alternatives': [
|
||||||
{
|
{
|
||||||
'paths_canonical': [],
|
'paths_canonical': [],
|
||||||
@@ -308,6 +311,7 @@ function(request_id, sendingAccount, destinationAccount) {
|
|||||||
'status': 'success',
|
'status': 'success',
|
||||||
'type': 'response',
|
'type': 'response',
|
||||||
'result': {
|
'result': {
|
||||||
|
'full_reply': true,
|
||||||
'alternatives': [
|
'alternatives': [
|
||||||
{
|
{
|
||||||
'paths_canonical': [],
|
'paths_canonical': [],
|
||||||
@@ -17,8 +17,11 @@ function isBTC(json) {
|
|||||||
return json === 'BTC' || json === '0000000000000000000000004254430000000000';
|
return json === 'BTC' || json === '0000000000000000000000004254430000000000';
|
||||||
}
|
}
|
||||||
|
|
||||||
function createResponse(request, response) {
|
function createResponse(request, response, overrides={}) {
|
||||||
return JSON.stringify(_.assign({}, response, {id: request.id}));
|
const result = _.assign({}, response.result, overrides);
|
||||||
|
const change = response.result && !_.isEmpty(overrides) ?
|
||||||
|
{id: request.id, result: result} : {id: request.id};
|
||||||
|
return JSON.stringify(_.assign({}, response, change));
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = function(port) {
|
module.exports = function(port) {
|
||||||
@@ -216,14 +219,20 @@ module.exports = function(port) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
mock.on('request_ripple_path_find', function(request, conn) {
|
mock.on('request_path_find', function(request, conn) {
|
||||||
let response = null;
|
let response = null;
|
||||||
|
if (request.subcommand === 'close') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (request.source_account === addresses.OTHER_ACCOUNT) {
|
if (request.source_account === addresses.OTHER_ACCOUNT) {
|
||||||
response = createResponse(request, fixtures.ripple_path_find.sendUSD);
|
response = createResponse(request, fixtures.path_find.sendUSD);
|
||||||
} else if (request.source_account === addresses.THIRD_ACCOUNT) {
|
} else if (request.source_account === addresses.THIRD_ACCOUNT) {
|
||||||
response = createResponse(request, fixtures.ripple_path_find.XrpToXrp);
|
response = createResponse(request, fixtures.path_find.XrpToXrp, {
|
||||||
|
destination_amount: request.destination_amount,
|
||||||
|
destination_address: request.destination_address
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
response = fixtures.ripple_path_find.generate.generateIOUPaymentPaths(
|
response = fixtures.path_find.generate.generateIOUPaymentPaths(
|
||||||
request.id, request.source_account, request.destination_account,
|
request.id, request.source_account, request.destination_account,
|
||||||
request.destination_amount);
|
request.destination_amount);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user