mirror of
https://github.com/Xahau/xahau.js.git
synced 2025-11-05 05:15:48 +00:00
fix orderbook subscription bug
This commit is contained in:
@@ -22,6 +22,7 @@ const Currency = require('./currency').Currency;
|
||||
const AutobridgeCalculator = require('./autobridgecalculator');
|
||||
const OrderBookUtils = require('./orderbookutils');
|
||||
const log = require('./log').internal.sub('orderbook');
|
||||
const RippleError = require('./rippleerror').RippleError;
|
||||
|
||||
/**
|
||||
* @constructor OrderBook
|
||||
@@ -326,15 +327,16 @@ OrderBook.prototype.requestOffers = function(callback = function() {},
|
||||
internal = false) {
|
||||
const self = this;
|
||||
|
||||
if (!this._remote.isConnected()) {
|
||||
if (!this._remote.isConnected() && !internal) {
|
||||
// do not make request if not online.
|
||||
// that requests will be queued and
|
||||
// eventually all of them will fire back
|
||||
callback(new RippleError('remote is offline'));
|
||||
return undefined;
|
||||
}
|
||||
|
||||
if (!this._shouldSubscribe) {
|
||||
callback(new Error('Should not request offers'));
|
||||
callback(new RippleError('Should not request offers'));
|
||||
return undefined;
|
||||
}
|
||||
|
||||
@@ -362,7 +364,7 @@ OrderBook.prototype.requestOffers = function(callback = function() {},
|
||||
|
||||
if (!Array.isArray(res.offers)) {
|
||||
// XXX What now?
|
||||
callback(new Error('Invalid response'));
|
||||
callback(new RippleError('Invalid response'));
|
||||
self.emit('model', []);
|
||||
return;
|
||||
}
|
||||
@@ -1351,7 +1353,7 @@ OrderBook.prototype.computeAutobridgedOffers = function(callback = function() {}
|
||||
assert(!this._currencyGets.is_native() && !this._currencyPays.is_native(),
|
||||
'Autobridging is only for IOU:IOU orderbooks');
|
||||
|
||||
|
||||
|
||||
if (this._destroyed) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -67,40 +67,155 @@ describe('OrderBook', function() {
|
||||
assert(book.isValid());
|
||||
});
|
||||
|
||||
it('Automatic subscription (based on listeners)', function(done) {
|
||||
const book = createRemote().createOrderBook({
|
||||
currency_gets: 'XRP',
|
||||
issuer_pays: addresses.ISSUER,
|
||||
currency_pays: 'BTC'
|
||||
});
|
||||
|
||||
book.subscribe = function() {
|
||||
done();
|
||||
};
|
||||
|
||||
book.on('model', function() {});
|
||||
});
|
||||
|
||||
it('Subscribe', function(done) {
|
||||
const book = createRemote().createOrderBook({
|
||||
currency_gets: 'XRP',
|
||||
issuer_pays: addresses.ISSUER,
|
||||
currency_pays: 'BTC'
|
||||
const remote = createRemote();
|
||||
const book = remote.createOrderBook({
|
||||
currency_pays: 'XRP',
|
||||
issuer_gets: addresses.ISSUER,
|
||||
currency_gets: 'BTC'
|
||||
});
|
||||
|
||||
let requestedOffers = false;
|
||||
remote.request = function(request) {
|
||||
const response = {};
|
||||
|
||||
book.subscribeTransactions = function() {
|
||||
assert(requestedOffers);
|
||||
done();
|
||||
};
|
||||
if (request.message.command === 'account_info') {
|
||||
response.account_data = {
|
||||
TransferRate: 1002000000
|
||||
};
|
||||
|
||||
book.requestOffers = function(callback) {
|
||||
requestedOffers = true;
|
||||
callback();
|
||||
} else if (request.message.command === 'book_offers') {
|
||||
response.offers = [];
|
||||
}
|
||||
|
||||
request.emit('success', response);
|
||||
};
|
||||
|
||||
book.subscribe();
|
||||
assert.strictEqual(book._subscribed, true);
|
||||
done();
|
||||
});
|
||||
|
||||
it('Subscribe - gets XRP', function(done) {
|
||||
const remote = createRemote();
|
||||
const book = remote.createOrderBook({
|
||||
currency_gets: 'XRP',
|
||||
issuer_pays: addresses.ISSUER,
|
||||
currency_pays: 'BTC'
|
||||
});
|
||||
|
||||
remote.isConnected = function() {
|
||||
return false;
|
||||
};
|
||||
|
||||
remote.request = function(request) {
|
||||
const response = {};
|
||||
if (request.message.command === 'book_offers') {
|
||||
response.offers = [];
|
||||
}
|
||||
|
||||
request.emit('success', response);
|
||||
};
|
||||
|
||||
book.subscribe();
|
||||
assert.strictEqual(book._subscribed, true, '_subscribed');
|
||||
done();
|
||||
});
|
||||
|
||||
it('Subscribe - autobridged', function(done) {
|
||||
|
||||
const remote = createRemote();
|
||||
const book = remote.createOrderBook({
|
||||
currency_pays: 'USD',
|
||||
issuer_pays: addresses.ISSUER,
|
||||
currency_gets: 'BTC',
|
||||
issuer_gets: addresses.ISSUER
|
||||
});
|
||||
|
||||
remote.request = function(request) {
|
||||
const response = {};
|
||||
|
||||
if (request.message.command === 'account_info') {
|
||||
response.account_data = {
|
||||
TransferRate: 1002000000
|
||||
};
|
||||
|
||||
} else if (request.message.command === 'book_offers') {
|
||||
response.offers = [];
|
||||
}
|
||||
|
||||
request.emit('success', response);
|
||||
};
|
||||
|
||||
book.subscribe();
|
||||
assert.strictEqual(book._subscribed, true, '_subscribed');
|
||||
done();
|
||||
});
|
||||
|
||||
it('Automatic subscription (based on listeners)', function(done) {
|
||||
this.timeout(100);
|
||||
|
||||
const remote = createRemote();
|
||||
const book = remote.createOrderBook({
|
||||
currency_gets: 'XRP',
|
||||
issuer_pays: addresses.ISSUER,
|
||||
currency_pays: 'BTC'
|
||||
});
|
||||
|
||||
remote.request = function(request) {
|
||||
const response = {};
|
||||
|
||||
if (request.message.command === 'account_info') {
|
||||
response.account_data = {
|
||||
TransferRate: 1002000000
|
||||
};
|
||||
|
||||
} else if (request.message.command === 'book_offers') {
|
||||
response.offers = [];
|
||||
}
|
||||
|
||||
setImmediate(function() {
|
||||
request.emit('success', response);
|
||||
});
|
||||
};
|
||||
|
||||
book.on('model', function(offers) {
|
||||
assert.strictEqual(offers.length, 0);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('Automatic subscription (based on listeners) - autobridged', function(done) {
|
||||
this.timeout(100);
|
||||
|
||||
const remote = createRemote();
|
||||
const book = remote.createOrderBook({
|
||||
currency_pays: 'USD',
|
||||
issuer_pays: addresses.ISSUER,
|
||||
currency_gets: 'BTC',
|
||||
issuer_gets: addresses.ISSUER
|
||||
});
|
||||
|
||||
remote.request = function(request) {
|
||||
const response = {};
|
||||
|
||||
if (request.message.command === 'account_info') {
|
||||
response.account_data = {
|
||||
TransferRate: 1002000000
|
||||
};
|
||||
|
||||
} else if (request.message.command === 'book_offers') {
|
||||
response.offers = [];
|
||||
}
|
||||
|
||||
setImmediate(function() {
|
||||
request.emit('success', response);
|
||||
});
|
||||
};
|
||||
|
||||
book.on('model', function(offers) {
|
||||
assert.strictEqual(offers.length, 0);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('Unsubscribe', function(done) {
|
||||
|
||||
Reference in New Issue
Block a user