mirror of
https://github.com/Xahau/xahau.js.git
synced 2025-12-06 17:27:59 +00:00
Improve errors (#893)
- `RippledError`: Include the full response from the `rippled` server. - A new test ensures correct behavior when `streams` is not an array. - `NotConnectedError` may be thrown with a different message than before.
This commit is contained in:
@@ -1,5 +1,11 @@
|
|||||||
# ripple-lib Release History
|
# ripple-lib Release History
|
||||||
|
|
||||||
|
## 1.0.0 (UNRELEASED)
|
||||||
|
|
||||||
|
+ Potentially breaking change: Improve errors. For example, `RippledError` now includes the full response from
|
||||||
|
the `rippled` server ([#687](https://github.com/ripple/ripple-lib/issues/687)). `NotConnectedError`
|
||||||
|
may be thrown with a different message than before.
|
||||||
|
|
||||||
## 1.0.0-beta.0 (2018-05-10)
|
## 1.0.0-beta.0 (2018-05-10)
|
||||||
|
|
||||||
+ [Add `request`, `hasNextPage`, and
|
+ [Add `request`, `hasNextPage`, and
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ class Connection extends EventEmitter {
|
|||||||
const data = JSON.parse(message)
|
const data = JSON.parse(message)
|
||||||
if (data.type === 'response') {
|
if (data.type === 'response') {
|
||||||
if (!(Number.isInteger(data.id) && data.id >= 0)) {
|
if (!(Number.isInteger(data.id) && data.id >= 0)) {
|
||||||
throw new ResponseFormatError('valid id not found in response')
|
throw new ResponseFormatError('valid id not found in response', data)
|
||||||
}
|
}
|
||||||
return [data.id.toString(), data]
|
return [data.id.toString(), data]
|
||||||
} else if (data.type === undefined && data.error) {
|
} else if (data.type === undefined && data.error) {
|
||||||
@@ -241,7 +241,7 @@ class Connection extends EventEmitter {
|
|||||||
_onOpenError(reject, error) {
|
_onOpenError(reject, error) {
|
||||||
this._onOpenErrorBound = null
|
this._onOpenErrorBound = null
|
||||||
this._unbindOnUnxpectedClose()
|
this._unbindOnUnxpectedClose()
|
||||||
reject(new NotConnectedError(error && error.message))
|
reject(new NotConnectedError(error.message, error))
|
||||||
}
|
}
|
||||||
|
|
||||||
_createWebSocket(): WebSocket {
|
_createWebSocket(): WebSocket {
|
||||||
@@ -399,7 +399,7 @@ class Connection extends EventEmitter {
|
|||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
this._ws.send(message, undefined, error => {
|
this._ws.send(message, undefined, error => {
|
||||||
if (error) {
|
if (error) {
|
||||||
reject(new DisconnectedError(error.message))
|
reject(new DisconnectedError(error.message, error))
|
||||||
} else {
|
} else {
|
||||||
resolve()
|
resolve()
|
||||||
}
|
}
|
||||||
@@ -445,12 +445,12 @@ class Connection extends EventEmitter {
|
|||||||
|
|
||||||
this.once(eventName, response => {
|
this.once(eventName, response => {
|
||||||
if (response.status === 'error') {
|
if (response.status === 'error') {
|
||||||
_reject(new RippledError(response.error))
|
_reject(new RippledError(response.error, response))
|
||||||
} else if (response.status === 'success') {
|
} else if (response.status === 'success') {
|
||||||
_resolve(response.result)
|
_resolve(response.result)
|
||||||
} else {
|
} else {
|
||||||
_reject(new ResponseFormatError(
|
_reject(new ResponseFormatError(
|
||||||
'unrecognized status: ' + response.status))
|
'unrecognized status: ' + response.status, response))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -381,7 +381,7 @@ describe('Connection', function() {
|
|||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('propagate error message', function(done) {
|
it('propagates error message', function(done) {
|
||||||
this.api.on('error', (errorCode, errorMessage, data) => {
|
this.api.on('error', (errorCode, errorMessage, data) => {
|
||||||
assert.strictEqual(errorCode, 'slowDown');
|
assert.strictEqual(errorCode, 'slowDown');
|
||||||
assert.strictEqual(errorMessage, 'slow down');
|
assert.strictEqual(errorMessage, 'slow down');
|
||||||
@@ -393,6 +393,19 @@ describe('Connection', function() {
|
|||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('propagates RippledError data', function(done) {
|
||||||
|
this.api.request('subscribe', {streams: 'validations'}).catch(error => {
|
||||||
|
assert.strictEqual(error.name, 'RippledError')
|
||||||
|
assert.strictEqual(error.message, 'invalidParams')
|
||||||
|
assert.strictEqual(error.data.error_code, 31)
|
||||||
|
assert.strictEqual(error.data.error_message, 'Invalid parameters.')
|
||||||
|
assert.deepEqual(error.data.request, { command: 'subscribe', id: 0, streams: 'validations' })
|
||||||
|
assert.strictEqual(error.data.status, 'error')
|
||||||
|
assert.strictEqual(error.data.type, 'response')
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
it('unrecognized message type', function(done) {
|
it('unrecognized message type', function(done) {
|
||||||
// This enables us to automatically support any
|
// This enables us to automatically support any
|
||||||
// new messages added by rippled in the future.
|
// new messages added by rippled in the future.
|
||||||
@@ -414,8 +427,8 @@ describe('Connection', function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should throw RippledNotInitializedError if server does not have ' +
|
it('should throw RippledNotInitializedError if server does not have ' +
|
||||||
'validated ledgers',
|
'validated ledgers', function() {
|
||||||
function() {
|
|
||||||
this.timeout(3000);
|
this.timeout(3000);
|
||||||
|
|
||||||
this.api.connection._send(JSON.stringify({
|
this.api.connection._send(JSON.stringify({
|
||||||
@@ -439,13 +452,13 @@ describe('Connection', function() {
|
|||||||
this.api.on('error', error => {
|
this.api.on('error', error => {
|
||||||
done(error || new Error('Should not emit error.'));
|
done(error || new Error('Should not emit error.'));
|
||||||
});
|
});
|
||||||
let disconncedCount = 0;
|
let disconnectedCount = 0;
|
||||||
this.api.on('connected', () => {
|
this.api.on('connected', () => {
|
||||||
done(disconncedCount !== 1 ?
|
done(disconnectedCount !== 1 ?
|
||||||
new Error('Wrong number of disconnects') : undefined);
|
new Error('Wrong number of disconnects') : undefined);
|
||||||
});
|
});
|
||||||
this.api.on('disconnected', () => {
|
this.api.on('disconnected', () => {
|
||||||
disconncedCount++;
|
disconnectedCount++;
|
||||||
});
|
});
|
||||||
|
|
||||||
this.api.connection._send(JSON.stringify({
|
this.api.connection._send(JSON.stringify({
|
||||||
|
|||||||
1
test/fixtures/rippled/index.js
vendored
1
test/fixtures/rippled/index.js
vendored
@@ -16,6 +16,7 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
empty: require('./empty'),
|
empty: require('./empty'),
|
||||||
subscribe: require('./subscribe'),
|
subscribe: require('./subscribe'),
|
||||||
|
subscribe_error: require('./subscribe_error'),
|
||||||
unsubscribe: require('./unsubscribe'),
|
unsubscribe: require('./unsubscribe'),
|
||||||
account_objects: {
|
account_objects: {
|
||||||
normal: require('./account-objects'),
|
normal: require('./account-objects'),
|
||||||
|
|||||||
13
test/fixtures/rippled/subscribe_error.json
vendored
Normal file
13
test/fixtures/rippled/subscribe_error.json
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"id": 0,
|
||||||
|
"status": "error",
|
||||||
|
"type": "response",
|
||||||
|
"error": "invalidParams",
|
||||||
|
"error_code": 31,
|
||||||
|
"error_message": "Invalid parameters.",
|
||||||
|
"request": {
|
||||||
|
"command": "subscribe",
|
||||||
|
"id": 0,
|
||||||
|
"streams": "validations"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -168,7 +168,9 @@ module.exports = function createMockRippled(port) {
|
|||||||
|
|
||||||
mock.on('request_subscribe', function (request, conn) {
|
mock.on('request_subscribe', function (request, conn) {
|
||||||
assert.strictEqual(request.command, 'subscribe');
|
assert.strictEqual(request.command, 'subscribe');
|
||||||
if (mock.config.returnEmptySubscribeRequest) {
|
if (request && request.streams === 'validations') {
|
||||||
|
conn.send(createResponse(request, fixtures.subscribe_error))
|
||||||
|
} else if (mock.config.returnEmptySubscribeRequest) {
|
||||||
mock.config.returnEmptySubscribeRequest--;
|
mock.config.returnEmptySubscribeRequest--;
|
||||||
conn.send(createResponse(request, fixtures.empty));
|
conn.send(createResponse(request, fixtures.empty));
|
||||||
} else if (request.accounts) {
|
} else if (request.accounts) {
|
||||||
|
|||||||
Reference in New Issue
Block a user