From 7ee368965cc0d8261c1940837a4b7116be76f97e Mon Sep 17 00:00:00 2001 From: Chris Clark Date: Wed, 16 Sep 2015 17:53:19 -0700 Subject: [PATCH] Add ledgerClosed event --- src/api/common/schema-validator.js | 3 ++- src/api/common/schemas/ledger-closed.json | 21 +++++++++++++++++++ src/api/common/schemas/outcome.json | 2 +- src/api/index.js | 14 +++++++++++-- src/api/server/server.js | 21 ++++++++++++++++++- test/api-test.js | 7 +++++++ test/fixtures/api/responses/index.js | 3 ++- .../fixtures/api/responses/ledger-closed.json | 11 ++++++++++ 8 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 src/api/common/schemas/ledger-closed.json create mode 100644 test/fixtures/api/responses/ledger-closed.json diff --git a/src/api/common/schema-validator.js b/src/api/common/schema-validator.js index de884c9f..ec516eb0 100644 --- a/src/api/common/schema-validator.js +++ b/src/api/common/schema-validator.js @@ -78,7 +78,8 @@ function loadSchemas() { require('./schemas/tx.json'), require('./schemas/uint32.json'), require('./schemas/value.json'), - require('./schemas/prepare.json') + require('./schemas/prepare.json'), + require('./schemas/ledger-closed.json') ]; const titles = _.map(schemas, schema => schema.title); const duplicates = _.keys(_.pick(_.countBy(titles), count => count > 1)); diff --git a/src/api/common/schemas/ledger-closed.json b/src/api/common/schemas/ledger-closed.json new file mode 100644 index 00000000..916ba62c --- /dev/null +++ b/src/api/common/schemas/ledger-closed.json @@ -0,0 +1,21 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "ledgerClosed", + "description": "A ledgerClosed event message", + "type": "object", + "properties": { + "feeBase": {"type": "integer", "minimum": 0}, + "feeReference": {"type": "integer", "minimum": 0}, + "ledgerHash": {"$ref": "ledgerHash"}, + "ledgerVersion": {"$ref": "ledgerVersion"}, + "ledgerTimestamp": {"type": "string", "format": "date-time"}, + "reserveBase": {"type": "integer", "minimum": 0}, + "reserveIncrement": {"type": "integer", "minimum": 0}, + "transactionCount": {"type": "integer", "minimum": 0}, + "validatedLedgerVersions": {"type": "string"} + }, + "addtionalProperties": false, + "required": ["feeBase", "feeReference", "ledgerHash", "ledgerTimestamp", + "reserveBase", "reserveIncrement", "transactionCount", + "ledgerVersion", "validatedLedgerVersions"] +} diff --git a/src/api/common/schemas/outcome.json b/src/api/common/schemas/outcome.json index 0dfbcaab..a02452ab 100644 --- a/src/api/common/schemas/outcome.json +++ b/src/api/common/schemas/outcome.json @@ -4,7 +4,7 @@ "type": "object", "properties": { "result": {"type": "string"}, - "timestamp": {"type": "string"}, + "timestamp": {"type": "string", "format": "date-time"}, "fee": {"$ref": "value"}, "balanceChanges": { "type": "object", diff --git a/src/api/index.js b/src/api/index.js index 68aed81d..e04844ea 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -2,6 +2,8 @@ 'use strict'; const _ = require('lodash'); +const util = require('util'); +const EventEmitter = require('events').EventEmitter; const common = require('./common'); const server = require('./server/server'); const connect = server.connect; @@ -34,11 +36,19 @@ const getLedger = require('./ledger/ledger'); function RippleAPI(options: {}) { common.validate.remoteOptions(options); + if (EventEmitter instanceof Function) { // always true, needed for flow + EventEmitter.call(this); + } const _options = _.assign({}, options, {automatic_resubmission: false}); this.remote = new common.core.Remote(_options); + this.remote.on('ledger_closed', message => { + this.emit('ledgerClosed', server.formatLedgerClose(message)); + }); } -RippleAPI.prototype = { +util.inherits(RippleAPI, EventEmitter); + +_.assign(RippleAPI.prototype, { connect, disconnect, isConnected, @@ -67,7 +77,7 @@ RippleAPI.prototype = { generateAddress, errors -}; +}); // these are exposed only for use by unit tests; they are not part of the API RippleAPI._PRIVATE = { diff --git a/src/api/server/server.js b/src/api/server/server.js index ede7f104..51417e27 100644 --- a/src/api/server/server.js +++ b/src/api/server/server.js @@ -87,11 +87,30 @@ function getServerInfo(): Promise { return common.promisify(getServerInfoAsync.bind(this))(); } +function rippleTimeToISO8601(rippleTime: string): string { + return new Date(common.core.utils.toTimestamp(rippleTime)).toISOString(); +} + +function formatLedgerClose(ledgerClose: Object): Object { + return { + feeBase: ledgerClose.fee_base, + feeReference: ledgerClose.fee_ref, + ledgerHash: ledgerClose.ledger_hash, + ledgerVersion: ledgerClose.ledger_index, + ledgerTimestamp: rippleTimeToISO8601(ledgerClose.ledger_time), + reserveBase: ledgerClose.reserve_base, + reserveIncrement: ledgerClose.reserve_inc, + transactionCount: ledgerClose.txn_count, + validatedLedgerVersions: ledgerClose.validated_ledgers + }; +} + module.exports = { connect, disconnect, isConnected, getServerInfo, getFee, - getLedgerVersion + getLedgerVersion, + formatLedgerClose }; diff --git a/test/api-test.js b/test/api-test.js index d042a69f..dd4c0d80 100644 --- a/test/api-test.js +++ b/test/api-test.js @@ -786,6 +786,13 @@ describe('RippleAPI', function() { }); + it('ledgerClosed', function(done) { + this.api.on('ledgerClosed', message => { + checkResult(responses.ledgerClosed, 'ledgerClosed', message); + done(); + }); + this.api.remote.getServer().emit('message', ledgerClosed); + }); }); describe('RippleAPI - offline', function() { diff --git a/test/fixtures/api/responses/index.js b/test/fixtures/api/responses/index.js index 87d87f97..c2245280 100644 --- a/test/fixtures/api/responses/index.js +++ b/test/fixtures/api/responses/index.js @@ -52,5 +52,6 @@ module.exports = { complex: require('./prepare-trustline.json') }, sign: require('./sign.json'), - submit: require('./submit.json') + submit: require('./submit.json'), + ledgerClosed: require('./ledger-closed.json') }; diff --git a/test/fixtures/api/responses/ledger-closed.json b/test/fixtures/api/responses/ledger-closed.json new file mode 100644 index 00000000..e3915702 --- /dev/null +++ b/test/fixtures/api/responses/ledger-closed.json @@ -0,0 +1,11 @@ +{ + "feeBase": 10, + "feeReference": 10, + "ledgerVersion": 14804627, + "ledgerHash": "9141FA171F2C0CE63E609466AF728FF66C12F7ACD4B4B50B0947A7F3409D593A", + "ledgerTimestamp": "2015-07-23T05:50:40.000Z", + "reserveBase": 20000000, + "reserveIncrement": 5000000, + "transactionCount": 19, + "validatedLedgerVersions": "13983423-14804627" +}