mirror of
https://github.com/Xahau/xahau.js.git
synced 2025-11-21 04:35:49 +00:00
154 lines
4.9 KiB
JavaScript
154 lines
4.9 KiB
JavaScript
/* @flow */
|
|
'use strict'; // eslint-disable-line
|
|
|
|
/* eslint-disable max-len */
|
|
// Enable core-js polyfills. This allows use of ES6/7 extensions listed here:
|
|
// https://github.com/zloirock/core-js/blob/fb0890f32dabe8d4d88a4350d1b268446127132e/shim.js#L1-L103
|
|
/* eslint-enable max-len */
|
|
|
|
// In node.js env, polyfill might be already loaded (from any npm package),
|
|
// that's why we do this check.
|
|
if (!global._babelPolyfill) {
|
|
require('babel-polyfill');
|
|
}
|
|
|
|
const _ = require('lodash');
|
|
const EventEmitter = require('events').EventEmitter;
|
|
const common = require('./common');
|
|
const server = require('./server/server');
|
|
const connect = server.connect;
|
|
const disconnect = server.disconnect;
|
|
const getServerInfo = server.getServerInfo;
|
|
const getFee = server.getFee;
|
|
const isConnected = server.isConnected;
|
|
const getLedgerVersion = server.getLedgerVersion;
|
|
const getTransaction = require('./ledger/transaction');
|
|
const getTransactions = require('./ledger/transactions');
|
|
const getTrustlines = require('./ledger/trustlines');
|
|
const getBalances = require('./ledger/balances');
|
|
const getBalanceSheet = require('./ledger/balance-sheet');
|
|
const getPaths = require('./ledger/pathfind');
|
|
const getOrders = require('./ledger/orders');
|
|
const getOrderbook = require('./ledger/orderbook');
|
|
const getSettings = require('./ledger/settings');
|
|
const getAccountInfo = require('./ledger/accountinfo');
|
|
const preparePayment = require('./transaction/payment');
|
|
const prepareTrustline = require('./transaction/trustline');
|
|
const prepareOrder = require('./transaction/order');
|
|
const prepareOrderCancellation = require('./transaction/ordercancellation');
|
|
const prepareSuspendedPaymentCreation =
|
|
require('./transaction/suspended-payment-creation');
|
|
const prepareSuspendedPaymentExecution =
|
|
require('./transaction/suspended-payment-execution');
|
|
const prepareSuspendedPaymentCancellation =
|
|
require('./transaction/suspended-payment-cancellation');
|
|
const prepareSettings = require('./transaction/settings');
|
|
const sign = require('./transaction/sign');
|
|
const combine = require('./transaction/combine');
|
|
const submit = require('./transaction/submit');
|
|
const errors = require('./common').errors;
|
|
const generateAddress =
|
|
require('./offline/generate-address').generateAddressAPI;
|
|
const computeLedgerHash = require('./offline/ledgerhash');
|
|
const getLedger = require('./ledger/ledger');
|
|
|
|
type APIOptions = {
|
|
server?: string,
|
|
feeCushion?: number,
|
|
trace?: boolean,
|
|
proxy?: string,
|
|
timeout?: number
|
|
}
|
|
|
|
// prevent access to non-validated ledger versions
|
|
class RestrictedConnection extends common.Connection {
|
|
request(request, timeout) {
|
|
const ledger_index = request.ledger_index;
|
|
if (ledger_index !== undefined && ledger_index !== 'validated') {
|
|
if (!_.isNumber(ledger_index) || ledger_index > this._ledgerVersion) {
|
|
return Promise.reject(new errors.LedgerVersionError(
|
|
`ledgerVersion ${ledger_index} is greater than server\'s ` +
|
|
`most recent validated ledger: ${this._ledgerVersion}`));
|
|
}
|
|
}
|
|
return super.request(request, timeout);
|
|
}
|
|
}
|
|
|
|
class RippleAPI extends EventEmitter {
|
|
constructor(options: APIOptions = {}) {
|
|
common.validate.apiOptions(options);
|
|
super();
|
|
this._feeCushion = options.feeCushion || 1.2;
|
|
const serverURL = options.server;
|
|
if (serverURL !== undefined) {
|
|
this.connection = new RestrictedConnection(serverURL, options);
|
|
this.connection.on('ledgerClosed', message => {
|
|
this.emit('ledger', server.formatLedgerClose(message));
|
|
});
|
|
this.connection.on('error', (errorCode, errorMessage, data) => {
|
|
this.emit('error', errorCode, errorMessage, data);
|
|
});
|
|
this.connection.on('connected', () => {
|
|
this.emit('connected');
|
|
});
|
|
this.connection.on('disconnected', onError => {
|
|
this.emit('disconnected', onError);
|
|
});
|
|
} else {
|
|
// use null object pattern to provide better error message if user
|
|
// tries to call a method that requires a connection
|
|
this.connection = new RestrictedConnection(null, options);
|
|
}
|
|
}
|
|
}
|
|
|
|
_.assign(RippleAPI.prototype, {
|
|
connect,
|
|
disconnect,
|
|
isConnected,
|
|
getServerInfo,
|
|
getFee,
|
|
getLedgerVersion,
|
|
|
|
getTransaction,
|
|
getTransactions,
|
|
getTrustlines,
|
|
getBalances,
|
|
getBalanceSheet,
|
|
getPaths,
|
|
getOrders,
|
|
getOrderbook,
|
|
getSettings,
|
|
getAccountInfo,
|
|
getLedger,
|
|
|
|
preparePayment,
|
|
prepareTrustline,
|
|
prepareOrder,
|
|
prepareOrderCancellation,
|
|
prepareSuspendedPaymentCreation,
|
|
prepareSuspendedPaymentExecution,
|
|
prepareSuspendedPaymentCancellation,
|
|
prepareSettings,
|
|
sign,
|
|
combine,
|
|
submit,
|
|
|
|
generateAddress,
|
|
computeLedgerHash,
|
|
errors
|
|
});
|
|
|
|
// these are exposed only for use by unit tests; they are not part of the API
|
|
RippleAPI._PRIVATE = {
|
|
validate: common.validate,
|
|
RangeSet: require('./common/rangeset').RangeSet,
|
|
ledgerUtils: require('./ledger/utils'),
|
|
schemaValidator: require('./common/schema-validator')
|
|
};
|
|
|
|
module.exports = {
|
|
RippleAPI
|
|
};
|