diff --git a/CMakeLists.txt b/CMakeLists.txt index 2811b00e..1d49867c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,7 +36,7 @@ add_executable (reporting_main add_executable (reporting_tests unittests/main.cpp ) -add_library(reporting reporting/BackendInterface.h) +add_library(reporting backend/BackendInterface.h) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/deps") include(ExternalProject) message(${CMAKE_CURRENT_BINARY_DIR}) @@ -67,17 +67,16 @@ include(Postgres) target_sources(reporting PRIVATE - reporting/ETLSource.cpp - reporting/CassandraBackend.cpp - reporting/PostgresBackend.cpp - reporting/BackendIndexer.cpp - reporting/BackendInterface.cpp - reporting/Pg.cpp - reporting/P2pProxy.cpp - reporting/DBHelpers.cpp - reporting/ReportingETL.cpp - reporting/server/session.cpp - reporting/server/SubscriptionManager.cpp + backend/CassandraBackend.cpp + backend/PostgresBackend.cpp + backend/BackendIndexer.cpp + backend/BackendInterface.cpp + backend/Pg.cpp + backend/DBHelpers.cpp + etl/ETLSource.cpp + etl/ReportingETL.cpp + server/session.cpp + server/SubscriptionManager.cpp handlers/AccountInfo.cpp handlers/Tx.cpp handlers/RPCHelpers.cpp diff --git a/reporting/BackendFactory.h b/backend/BackendFactory.h similarity index 92% rename from reporting/BackendFactory.h rename to backend/BackendFactory.h index fb912284..c039d1cb 100644 --- a/reporting/BackendFactory.h +++ b/backend/BackendFactory.h @@ -2,9 +2,9 @@ #define RIPPLE_APP_REPORTING_BACKENDFACTORY_H_INCLUDED #include -#include -#include -#include +#include +#include +#include namespace Backend { std::unique_ptr diff --git a/reporting/BackendIndexer.cpp b/backend/BackendIndexer.cpp similarity index 99% rename from reporting/BackendIndexer.cpp rename to backend/BackendIndexer.cpp index c3e0dd70..c8859326 100644 --- a/reporting/BackendIndexer.cpp +++ b/backend/BackendIndexer.cpp @@ -1,4 +1,4 @@ -#include +#include namespace Backend { BackendIndexer::BackendIndexer(boost::json::object const& config) diff --git a/reporting/BackendInterface.cpp b/backend/BackendInterface.cpp similarity index 99% rename from reporting/BackendInterface.cpp rename to backend/BackendInterface.cpp index 5a1e7c5e..29cd2610 100644 --- a/reporting/BackendInterface.cpp +++ b/backend/BackendInterface.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include namespace Backend { bool BackendInterface::finishWrites(uint32_t ledgerSequence) const diff --git a/reporting/BackendInterface.h b/backend/BackendInterface.h similarity index 99% rename from reporting/BackendInterface.h rename to backend/BackendInterface.h index 122497de..39a0ef23 100644 --- a/reporting/BackendInterface.h +++ b/backend/BackendInterface.h @@ -2,7 +2,7 @@ #define RIPPLE_APP_REPORTING_BACKENDINTERFACE_H_INCLUDED #include #include -#include +#include namespace std { template <> struct hash diff --git a/reporting/CassandraBackend.cpp b/backend/CassandraBackend.cpp similarity index 99% rename from reporting/CassandraBackend.cpp rename to backend/CassandraBackend.cpp index 11ccc867..30f20a88 100644 --- a/reporting/CassandraBackend.cpp +++ b/backend/CassandraBackend.cpp @@ -1,6 +1,6 @@ #include -#include -#include +#include +#include #include /* namespace std { diff --git a/reporting/CassandraBackend.h b/backend/CassandraBackend.h similarity index 99% rename from reporting/CassandraBackend.h rename to backend/CassandraBackend.h index 652296b6..44683ab5 100644 --- a/reporting/CassandraBackend.h +++ b/backend/CassandraBackend.h @@ -31,8 +31,8 @@ #include #include #include -#include -#include +#include +#include namespace Backend { diff --git a/reporting/DBHelpers.cpp b/backend/DBHelpers.cpp similarity index 99% rename from reporting/DBHelpers.cpp rename to backend/DBHelpers.cpp index 9cf82030..0ce53a08 100644 --- a/reporting/DBHelpers.cpp +++ b/backend/DBHelpers.cpp @@ -19,7 +19,7 @@ #include #include -#include +#include static bool writeToLedgersDB(ripple::LedgerInfo const& info, PgQuery& pgQuery) diff --git a/reporting/DBHelpers.h b/backend/DBHelpers.h similarity index 99% rename from reporting/DBHelpers.h rename to backend/DBHelpers.h index 2a086705..e580f41b 100644 --- a/reporting/DBHelpers.h +++ b/backend/DBHelpers.h @@ -23,7 +23,7 @@ #include #include #include -#include +#include /// Struct used to keep track of what to write to transactions and /// account_transactions tables in Postgres diff --git a/reporting/Pg.cpp b/backend/Pg.cpp similarity index 99% rename from reporting/Pg.cpp rename to backend/Pg.cpp index c5e351b2..e68c5775 100644 --- a/reporting/Pg.cpp +++ b/backend/Pg.cpp @@ -39,7 +39,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/reporting/Pg.h b/backend/Pg.h similarity index 100% rename from reporting/Pg.h rename to backend/Pg.h diff --git a/reporting/PostgresBackend.cpp b/backend/PostgresBackend.cpp similarity index 99% rename from reporting/PostgresBackend.cpp rename to backend/PostgresBackend.cpp index c2adbade..aab7471a 100644 --- a/reporting/PostgresBackend.cpp +++ b/backend/PostgresBackend.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include namespace Backend { PostgresBackend::PostgresBackend(boost::json::object const& config) diff --git a/reporting/PostgresBackend.h b/backend/PostgresBackend.h similarity index 98% rename from reporting/PostgresBackend.h rename to backend/PostgresBackend.h index e2d0185e..ea7c9a72 100644 --- a/reporting/PostgresBackend.h +++ b/backend/PostgresBackend.h @@ -1,7 +1,7 @@ #ifndef RIPPLE_APP_REPORTING_POSTGRESBACKEND_H_INCLUDED #define RIPPLE_APP_REPORTING_POSTGRESBACKEND_H_INCLUDED #include -#include +#include namespace Backend { class PostgresBackend : public BackendInterface diff --git a/reporting/README.md b/backend/README.md similarity index 100% rename from reporting/README.md rename to backend/README.md diff --git a/reporting/ETLHelpers.h b/etl/ETLHelpers.h similarity index 100% rename from reporting/ETLHelpers.h rename to etl/ETLHelpers.h diff --git a/reporting/ETLSource.cpp b/etl/ETLSource.cpp similarity index 96% rename from reporting/ETLSource.cpp rename to etl/ETLSource.cpp index ddcc079f..3248df27 100644 --- a/reporting/ETLSource.cpp +++ b/etl/ETLSource.cpp @@ -19,15 +19,15 @@ */ //============================================================================== +#include #include #include #include #include #include #include -#include -#include -#include +#include +#include // Create ETL source without grpc endpoint // Fetch ledger and load initial ledger will fail for this source @@ -578,13 +578,7 @@ ETLLoadBalancer::ETLLoadBalancer( for (auto& entry : config) { std::unique_ptr source = ETLSource::make_ETLSource( - entry.as_object(), - ioContext, - backend, - subscriptions, - nwvl, - *this - ); + entry.as_object(), ioContext, backend, subscriptions, nwvl, *this); sources_.push_back(std::move(source)); BOOST_LOG_TRIVIAL(info) << __func__ << " : added etl source - " @@ -618,7 +612,7 @@ ETLLoadBalancer::fetchLedger(uint32_t ledgerSequence, bool getObjects) auto [status, data] = source->fetchLedger(ledgerSequence, getObjects); response = std::move(data); - if (status.ok() && (response.validated()|| true)) + if (status.ok() && (response.validated() || true)) { BOOST_LOG_TRIVIAL(info) << "Successfully fetched ledger = " << ledgerSequence @@ -644,7 +638,7 @@ ETLLoadBalancer::fetchLedger(uint32_t ledgerSequence, bool getObjects) } std::unique_ptr -ETLLoadBalancer::getP2pForwardingStub() const +ETLLoadBalancer::getRippledForwardingStub() const { if (sources_.size() == 0) return nullptr; @@ -653,7 +647,7 @@ ETLLoadBalancer::getP2pForwardingStub() const auto numAttempts = 0; while (numAttempts < sources_.size()) { - auto stub = sources_[sourceIdx]->getP2pForwardingStub(); + auto stub = sources_[sourceIdx]->getRippledForwardingStub(); if (!stub) { sourceIdx = (sourceIdx + 1) % sources_.size(); @@ -666,7 +660,7 @@ ETLLoadBalancer::getP2pForwardingStub() const } boost::json::object -ETLLoadBalancer::forwardToP2p(boost::json::object const& request) const +ETLLoadBalancer::forwardToRippled(boost::json::object const& request) const { boost::json::object res; if (sources_.size() == 0) @@ -676,7 +670,7 @@ ETLLoadBalancer::forwardToP2p(boost::json::object const& request) const auto numAttempts = 0; while (numAttempts < sources_.size()) { - res = sources_[sourceIdx]->forwardToP2p(request); + res = sources_[sourceIdx]->forwardToRippled(request); if (!res.contains("forwarded") || res.at("forwarded") != true) { @@ -691,7 +685,7 @@ ETLLoadBalancer::forwardToP2p(boost::json::object const& request) const } std::unique_ptr -ETLSource::getP2pForwardingStub() const +ETLSource::getRippledForwardingStub() const { if (!connected_) return nullptr; @@ -712,7 +706,7 @@ ETLSource::getP2pForwardingStub() const } boost::json::object -ETLSource::forwardToP2p(boost::json::object const& request) const +ETLSource::forwardToRippled(boost::json::object const& request) const { BOOST_LOG_TRIVIAL(debug) << "Attempting to forward request to tx. " << "request = " << boost::json::serialize(request); @@ -727,8 +721,8 @@ ETLSource::forwardToP2p(boost::json::object const& request) const namespace beast = boost::beast; // from namespace http = beast::http; // from namespace websocket = beast::websocket; // from - namespace net = boost::asio; // from - using tcp = boost::asio::ip::tcp; // from + namespace net = boost::asio; // from + using tcp = boost::asio::ip::tcp; // from try { // The io_context is required for all I/O @@ -775,11 +769,10 @@ ETLSource::forwardToP2p(boost::json::object const& request) const beast::flat_buffer buffer; ws->read(buffer); - + auto begin = static_cast(buffer.data().data()); auto end = begin + buffer.data().size(); - auto parsed = - boost::json::parse(std::string(begin, end)); + auto parsed = boost::json::parse(std::string(begin, end)); if (!parsed.is_object()) { @@ -817,7 +810,7 @@ ETLLoadBalancer::execute(Func f, uint32_t ledgerSequence) << __func__ << " : " << "Attempting to execute func. ledger sequence = " << ledgerSequence << " - source = " << source->toString(); - if (source->hasLedger(ledgerSequence)|| true) + if (source->hasLedger(ledgerSequence) || true) { bool res = f(source); if (res) diff --git a/reporting/ETLSource.h b/etl/ETLSource.h similarity index 93% rename from reporting/ETLSource.h rename to etl/ETLSource.h index 17f2512f..22a5ea7b 100644 --- a/reporting/ETLSource.h +++ b/etl/ETLSource.h @@ -25,23 +25,23 @@ #include #include #include -#include -#include +#include +#include #include "org/xrpl/rpc/v1/xrp_ledger.grpc.pb.h" #include -#include +#include class ETLLoadBalancer; class SubscriptionManager; /// This class manages a connection to a single ETL source. This is almost -/// always a p2p node, but really could be another reporting node. This class -/// subscribes to the ledgers and transactions_proposed streams of the -/// associated p2p node, and keeps track of which ledgers the p2p node has. This -/// class also has methods for extracting said ledgers. Lastly this class -/// forwards transactions received on the transactions_proposed streams to any -/// subscribers. +/// always a rippled node, but really could be another reporting node. This +/// class subscribes to the ledgers and transactions_proposed streams of the +/// associated rippled node, and keeps track of which ledgers the rippled node +/// has. This class also has methods for extracting said ledgers. Lastly this +/// class forwards transactions received on the transactions_proposed streams to +/// any subscribers. class ETLSource { @@ -316,13 +316,13 @@ public: void close(bool startAgain); - /// Get grpc stub to forward requests to p2p node + /// Get grpc stub to forward requests to rippled node /// @return stub to send requests to ETL source std::unique_ptr - getP2pForwardingStub() const; + getRippledForwardingStub() const; boost::json::object - forwardToP2p(boost::json::object const& request) const; + forwardToRippled(boost::json::object const& request) const; }; /// This class is used to manage connections to transaction processing processes /// This class spawns a listener for each etl source, which listens to messages @@ -420,16 +420,16 @@ public: return ret; } - /// Randomly select a p2p node to forward a gRPC request to - /// @return gRPC stub to forward requests to p2p node + /// Randomly select a rippled node to forward a gRPC request to + /// @return gRPC stub to forward requests to rippled node std::unique_ptr - getP2pForwardingStub() const; + getRippledForwardingStub() const; - /// Forward a JSON RPC request to a randomly selected p2p node + /// Forward a JSON RPC request to a randomly selected rippled node /// @param request JSON-RPC request - /// @return response received from p2p node + /// @return response received from rippled node boost::json::object - forwardToP2p(boost::json::object const& request) const; + forwardToRippled(boost::json::object const& request) const; private: /// f is a function that takes an ETLSource as an argument and returns a diff --git a/reporting/ReportingETL.cpp b/etl/ReportingETL.cpp similarity index 99% rename from reporting/ReportingETL.cpp rename to etl/ReportingETL.cpp index adff9a0e..3d9cbd27 100644 --- a/reporting/ReportingETL.cpp +++ b/etl/ReportingETL.cpp @@ -18,8 +18,8 @@ //============================================================================== #include -#include -#include +#include +#include #include #include diff --git a/reporting/ReportingETL.h b/etl/ReportingETL.h similarity index 98% rename from reporting/ReportingETL.h rename to etl/ReportingETL.h index 0e34829a..ad7d1455 100644 --- a/reporting/ReportingETL.h +++ b/etl/ReportingETL.h @@ -25,10 +25,9 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include #include "org/xrpl/rpc/v1/xrp_ledger.grpc.pb.h" #include diff --git a/handlers/AccountChannels.cpp b/handlers/AccountChannels.cpp index 262f4d68..6cf656a6 100644 --- a/handlers/AccountChannels.cpp +++ b/handlers/AccountChannels.cpp @@ -6,10 +6,8 @@ #include #include #include +#include #include -#include -#include -#include void addChannel(boost::json::array& jsonLines, ripple::SLE const& line) @@ -17,7 +15,8 @@ addChannel(boost::json::array& jsonLines, ripple::SLE const& line) boost::json::object jDst; jDst["channel_id"] = ripple::to_string(line.key()); jDst["account"] = ripple::to_string(line.getAccountID(ripple::sfAccount)); - jDst["destination_account"] = ripple::to_string(line.getAccountID(ripple::sfDestination)); + jDst["destination_account"] = + ripple::to_string(line.getAccountID(ripple::sfDestination)); jDst["amount"] = line[ripple::sfAmount].getText(); jDst["balance"] = line[ripple::sfBalance].getText(); if (publicKeyType(line[ripple::sfPublicKey])) @@ -53,21 +52,21 @@ doAccountChannels( return response; } - if(!request.contains("account")) + if (!request.contains("account")) { response["error"] = "Must contain account"; return response; } - if(!request.at("account").is_string()) + if (!request.at("account").is_string()) { response["error"] = "Account must be a string"; return response; } - + ripple::AccountID accountID; auto parsed = ripple::parseBase58( - request.at("account").as_string().c_str()); + request.at("account").as_string().c_str()); if (!parsed) { @@ -98,7 +97,7 @@ doAccountChannels( std::uint32_t limit = 200; if (request.contains("limit")) { - if(!request.at("limit").is_int64()) + if (!request.at("limit").is_int64()) { response["error"] = "limit must be integer"; return response; @@ -115,7 +114,7 @@ doAccountChannels( ripple::uint256 cursor = beast::zero; if (request.contains("cursor")) { - if(!request.at("cursor").is_string()) + if (!request.at("cursor").is_string()) { response["error"] = "limit must be string"; return response; @@ -138,26 +137,21 @@ doAccountChannels( if (sle.getType() == ripple::ltPAYCHAN && sle.getAccountID(ripple::sfAccount) == accountID && (!destAccount || - *destAccount == sle.getAccountID(ripple::sfDestination))) + *destAccount == sle.getAccountID(ripple::sfDestination))) { if (limit-- == 0) { return false; } - + addChannel(jsonChannels, sle); } return true; }; - auto nextCursor = - traverseOwnedNodes( - backend, - accountID, - *ledgerSequence, - cursor, - addToResponse); + auto nextCursor = traverseOwnedNodes( + backend, accountID, *ledgerSequence, cursor, addToResponse); if (nextCursor) response["next_cursor"] = ripple::strHex(*nextCursor); diff --git a/handlers/AccountCurrencies.cpp b/handlers/AccountCurrencies.cpp index 98e6bd76..7032d19a 100644 --- a/handlers/AccountCurrencies.cpp +++ b/handlers/AccountCurrencies.cpp @@ -6,10 +6,8 @@ #include #include #include +#include #include -#include -#include -#include boost::json::object doAccountCurrencies( @@ -25,21 +23,21 @@ doAccountCurrencies( return response; } - if(!request.contains("account")) + if (!request.contains("account")) { response["error"] = "Must contain account"; return response; } - if(!request.at("account").is_string()) + if (!request.at("account").is_string()) { response["error"] = "Account must be a string"; return response; } - + ripple::AccountID accountID; auto parsed = ripple::parseBase58( - request.at("account").as_string().c_str()); + request.at("account").as_string().c_str()); if (!parsed) { @@ -49,13 +47,12 @@ doAccountCurrencies( accountID = *parsed; - std::set send, receive; auto const addToResponse = [&](ripple::SLE const& sle) { if (sle.getType() == ripple::ltRIPPLE_STATE) { ripple::STAmount const& balance = - sle.getFieldAmount(ripple::sfBalance); + sle.getFieldAmount(ripple::sfBalance); auto lowLimit = sle.getFieldAmount(ripple::sfLowLimit); auto highLimit = sle.getFieldAmount(ripple::sfHighLimit); @@ -68,16 +65,12 @@ doAccountCurrencies( if ((-balance) < lineLimitPeer) send.insert(ripple::to_string(balance.getCurrency())); } - + return true; }; traverseOwnedNodes( - backend, - accountID, - *ledgerSequence, - beast::zero, - addToResponse); + backend, accountID, *ledgerSequence, beast::zero, addToResponse); response["send_currencies"] = boost::json::value(boost::json::array_kind); boost::json::array& jsonSend = response.at("send_currencies").as_array(); @@ -85,8 +78,10 @@ doAccountCurrencies( for (auto const& currency : send) jsonSend.push_back(currency.c_str()); - response["receive_currencies"] = boost::json::value(boost::json::array_kind); - boost::json::array& jsonReceive = response.at("receive_currencies").as_array(); + response["receive_currencies"] = + boost::json::value(boost::json::array_kind); + boost::json::array& jsonReceive = + response.at("receive_currencies").as_array(); for (auto const& currency : receive) jsonReceive.push_back(currency.c_str()); diff --git a/handlers/AccountInfo.cpp b/handlers/AccountInfo.cpp index 18375ac7..621e68cc 100644 --- a/handlers/AccountInfo.cpp +++ b/handlers/AccountInfo.cpp @@ -21,7 +21,7 @@ #include #include #include -#include +#include // { // account: , diff --git a/handlers/AccountLines.cpp b/handlers/AccountLines.cpp index 3d59ae16..d6f68de6 100644 --- a/handlers/AccountLines.cpp +++ b/handlers/AccountLines.cpp @@ -1,5 +1,5 @@ -#include #include +#include #include #include #include @@ -7,9 +7,8 @@ #include #include #include +#include #include -#include -#include void addLine( @@ -39,13 +38,19 @@ addLine( if (peerAccount and peerAccount != lineAccountIDPeer) return; - bool lineAuth = flags & (viewLowest ? ripple::lsfLowAuth : ripple::lsfHighAuth); - bool lineAuthPeer = flags & (!viewLowest ? ripple::lsfLowAuth : ripple::lsfHighAuth); - bool lineNoRipple = flags & (viewLowest ? ripple::lsfLowNoRipple : ripple::lsfHighNoRipple); + bool lineAuth = + flags & (viewLowest ? ripple::lsfLowAuth : ripple::lsfHighAuth); + bool lineAuthPeer = + flags & (!viewLowest ? ripple::lsfLowAuth : ripple::lsfHighAuth); + bool lineNoRipple = + flags & (viewLowest ? ripple::lsfLowNoRipple : ripple::lsfHighNoRipple); bool lineDefaultRipple = flags & ripple::lsfDefaultRipple; - bool lineNoRipplePeer = flags & (!viewLowest ? ripple::lsfLowNoRipple : ripple::lsfHighNoRipple); - bool lineFreeze = flags & (viewLowest ? ripple::lsfLowFreeze : ripple::lsfHighFreeze); - bool lineFreezePeer = flags & (!viewLowest ? ripple::lsfLowFreeze : ripple::lsfHighFreeze); + bool lineNoRipplePeer = flags & + (!viewLowest ? ripple::lsfLowNoRipple : ripple::lsfHighNoRipple); + bool lineFreeze = + flags & (viewLowest ? ripple::lsfLowFreeze : ripple::lsfHighFreeze); + bool lineFreezePeer = + flags & (!viewLowest ? ripple::lsfLowFreeze : ripple::lsfHighFreeze); ripple::STAmount const& saBalance(balance); ripple::STAmount const& saLimit(lineLimit); @@ -89,21 +94,21 @@ doAccountLines( return response; } - if(!request.contains("account")) + if (!request.contains("account")) { response["error"] = "Must contain account"; return response; } - if(!request.at("account").is_string()) + if (!request.at("account").is_string()) { response["error"] = "Account must be a string"; return response; } - + ripple::AccountID accountID; auto parsed = ripple::parseBase58( - request.at("account").as_string().c_str()); + request.at("account").as_string().c_str()); if (!parsed) { @@ -134,7 +139,7 @@ doAccountLines( std::uint32_t limit = 200; if (request.contains("limit")) { - if(!request.at("limit").is_int64()) + if (!request.at("limit").is_int64()) { response["error"] = "limit must be integer"; return response; @@ -151,7 +156,7 @@ doAccountLines( ripple::uint256 cursor = beast::zero; if (request.contains("cursor")) { - if(!request.at("cursor").is_string()) + if (!request.at("cursor").is_string()) { response["error"] = "limit must be string"; return response; @@ -166,7 +171,6 @@ doAccountLines( cursor = ripple::uint256::fromVoid(bytes->data()); } - response["lines"] = boost::json::value(boost::json::array_kind); boost::json::array& jsonLines = response.at("lines").as_array(); @@ -178,23 +182,18 @@ doAccountLines( { return false; } - + addLine(jsonLines, sle, accountID, peerAccount); } return true; }; - auto nextCursor = - traverseOwnedNodes( - backend, - accountID, - *ledgerSequence, - cursor, - addToResponse); + auto nextCursor = traverseOwnedNodes( + backend, accountID, *ledgerSequence, cursor, addToResponse); if (nextCursor) response["next_cursor"] = ripple::strHex(*nextCursor); return response; -} \ No newline at end of file +} diff --git a/handlers/AccountObjects.cpp b/handlers/AccountObjects.cpp index 4e92a6e7..5bb785f6 100644 --- a/handlers/AccountObjects.cpp +++ b/handlers/AccountObjects.cpp @@ -7,9 +7,8 @@ #include #include #include +#include #include -#include -#include std::unordered_map types{ {"state", ripple::ltRIPPLE_STATE}, diff --git a/handlers/AccountOffers.cpp b/handlers/AccountOffers.cpp index d57f0296..05c103ef 100644 --- a/handlers/AccountOffers.cpp +++ b/handlers/AccountOffers.cpp @@ -1,5 +1,5 @@ -#include #include +#include #include #include #include @@ -7,9 +7,8 @@ #include #include #include +#include #include -#include -#include void addOffer(boost::json::array& offersJson, ripple::SLE const& offer) @@ -19,7 +18,7 @@ addOffer(boost::json::array& offersJson, ripple::SLE const& offer) ripple::STAmount takerPays = offer.getFieldAmount(ripple::sfTakerPays); ripple::STAmount takerGets = offer.getFieldAmount(ripple::sfTakerGets); - + boost::json::object obj; if (!takerPays.native()) @@ -55,7 +54,7 @@ addOffer(boost::json::array& offersJson, ripple::SLE const& offer) obj["quality"] = rate.getText(); if (offer.isFieldPresent(ripple::sfExpiration)) obj["expiration"] = offer.getFieldU32(ripple::sfExpiration); - + offersJson.push_back(obj); }; boost::json::object @@ -72,21 +71,21 @@ doAccountOffers( return response; } - if(!request.contains("account")) + if (!request.contains("account")) { response["error"] = "Must contain account"; return response; } - if(!request.at("account").is_string()) + if (!request.at("account").is_string()) { response["error"] = "Account must be a string"; return response; } - + ripple::AccountID accountID; auto parsed = ripple::parseBase58( - request.at("account").as_string().c_str()); + request.at("account").as_string().c_str()); if (!parsed) { @@ -99,7 +98,7 @@ doAccountOffers( std::uint32_t limit = 200; if (request.contains("limit")) { - if(!request.at("limit").is_int64()) + if (!request.at("limit").is_int64()) { response["error"] = "limit must be integer"; return response; @@ -116,7 +115,7 @@ doAccountOffers( ripple::uint256 cursor = beast::zero; if (request.contains("cursor")) { - if(!request.at("cursor").is_string()) + if (!request.at("cursor").is_string()) { response["error"] = "limit must be string"; return response; @@ -131,7 +130,7 @@ doAccountOffers( cursor = ripple::uint256::fromVoid(bytes->data()); } - + response["offers"] = boost::json::value(boost::json::array_kind); boost::json::array& jsonLines = response.at("offers").as_array(); @@ -142,23 +141,18 @@ doAccountOffers( { return false; } - + addOffer(jsonLines, sle); } return true; }; - - auto nextCursor = - traverseOwnedNodes( - backend, - accountID, - *ledgerSequence, - cursor, - addToResponse); + + auto nextCursor = traverseOwnedNodes( + backend, accountID, *ledgerSequence, cursor, addToResponse); if (nextCursor) response["next_cursor"] = ripple::strHex(*nextCursor); return response; -} \ No newline at end of file +} diff --git a/handlers/AccountTx.cpp b/handlers/AccountTx.cpp index ad00d34d..8cc57c1c 100644 --- a/handlers/AccountTx.cpp +++ b/handlers/AccountTx.cpp @@ -18,7 +18,7 @@ //============================================================================== #include -#include +#include // { // account: account, diff --git a/handlers/BookOffers.cpp b/handlers/BookOffers.cpp index e638c593..877ba748 100644 --- a/handlers/BookOffers.cpp +++ b/handlers/BookOffers.cpp @@ -6,10 +6,9 @@ #include #include #include +#include +#include #include -#include -#include -#include boost::json::object doBookOffers( @@ -230,7 +229,7 @@ doBookOffers( return response; } - takerID = + takerID = accountFromStringStrict(request.at("taker").as_string().c_str()); if (!takerID) { @@ -251,10 +250,10 @@ doBookOffers( backend.fetchBookOffers(bookBase, *ledgerSequence, limit, cursor); auto end = std::chrono::system_clock::now(); - BOOST_LOG_TRIVIAL(warning) << "Time loading books: " - << ((end - start).count() / 1000000000.0); + BOOST_LOG_TRIVIAL(warning) + << "Time loading books: " << ((end - start).count() / 1000000000.0); - if(warning) + if (warning) response["warning"] = *warning; response["offers"] = boost::json::value(boost::json::array_kind); @@ -270,13 +269,17 @@ doBookOffers( { ripple::SerialIter it{obj.blob.data(), obj.blob.size()}; ripple::SLE offer{it, obj.key}; - ripple::uint256 bookDir = offer.getFieldH256(ripple::sfBookDirectory); + ripple::uint256 bookDir = + offer.getFieldH256(ripple::sfBookDirectory); boost::json::object offerJson = toJson(offer); - offerJson["quality"] = ripple::amountFromQuality(getQuality(bookDir)).getText(); + offerJson["quality"] = + ripple::amountFromQuality(getQuality(bookDir)).getText(); jsonOffers.push_back(offerJson); } - catch (std::exception const& e) {} + catch (std::exception const& e) + { + } } end = std::chrono::system_clock::now(); diff --git a/handlers/Ledger.cpp b/handlers/Ledger.cpp index b82168bd..a823b265 100644 --- a/handlers/Ledger.cpp +++ b/handlers/Ledger.cpp @@ -1,5 +1,5 @@ #include -#include +#include boost::json::object doLedger(boost::json::object const& request, BackendInterface const& backend) diff --git a/handlers/LedgerData.cpp b/handlers/LedgerData.cpp index cd12fdb7..a5fc96a8 100644 --- a/handlers/LedgerData.cpp +++ b/handlers/LedgerData.cpp @@ -21,7 +21,7 @@ #include #include #include -#include +#include // Get state nodes from a ledger // Inputs: // limit: integer, maximum number of entries diff --git a/handlers/LedgerEntry.cpp b/handlers/LedgerEntry.cpp index dcccc583..1b6c9703 100644 --- a/handlers/LedgerEntry.cpp +++ b/handlers/LedgerEntry.cpp @@ -2,7 +2,7 @@ #include #include #include -#include +#include // { // ledger_hash : // ledger_index : diff --git a/handlers/LedgerRange.cpp b/handlers/LedgerRange.cpp index 028b903c..395b0174 100644 --- a/handlers/LedgerRange.cpp +++ b/handlers/LedgerRange.cpp @@ -1,5 +1,5 @@ #include -#include +#include boost::json::object doLedgerRange( diff --git a/handlers/RPCHelpers.cpp b/handlers/RPCHelpers.cpp index 4f1ce9d0..86c790ae 100644 --- a/handlers/RPCHelpers.cpp +++ b/handlers/RPCHelpers.cpp @@ -1,5 +1,5 @@ #include -#include +#include std::optional accountFromStringStrict(std::string const& account) diff --git a/handlers/RPCHelpers.h b/handlers/RPCHelpers.h index ee185ccd..56849fce 100644 --- a/handlers/RPCHelpers.h +++ b/handlers/RPCHelpers.h @@ -5,7 +5,7 @@ #include #include #include -#include +#include std::optional accountFromStringStrict(std::string const& account); diff --git a/handlers/ServerInfo.cpp b/handlers/ServerInfo.cpp index 852e2686..344643ce 100644 --- a/handlers/ServerInfo.cpp +++ b/handlers/ServerInfo.cpp @@ -1,5 +1,5 @@ #include -#include +#include boost::json::object doServerInfo( boost::json::object const& request, diff --git a/handlers/Subscribe.cpp b/handlers/Subscribe.cpp index 0a5a20c0..ae2bfc24 100644 --- a/handlers/Subscribe.cpp +++ b/handlers/Subscribe.cpp @@ -1,11 +1,11 @@ #include -#include #include +#include -static std::unordered_set validStreams { +static std::unordered_set validStreams{ "ledger", "transactions", - "transactions_proposed" }; + "transactions_proposed"}; boost::json::value validateStreams(boost::json::object const& request) @@ -99,7 +99,7 @@ validateAccounts( if (!id) { return boost::json::string("invalid account " + s); - } + } } return nullptr; @@ -119,7 +119,7 @@ subscribeToAccounts( auto accountID = accountFromStringStrict(s); - if(!accountID) + if (!accountID) { assert(false); continue; @@ -143,7 +143,7 @@ unsubscribeToAccounts( auto accountID = accountFromStringStrict(s); - if(!accountID) + if (!accountID) { assert(false); continue; @@ -159,7 +159,8 @@ subscribeToAccountsProposed( std::shared_ptr& session, SubscriptionManager& manager) { - boost::json::array const& accounts = request.at("accounts_proposed").as_array(); + boost::json::array const& accounts = + request.at("accounts_proposed").as_array(); for (auto const& account : accounts) { @@ -167,7 +168,7 @@ subscribeToAccountsProposed( auto accountID = ripple::parseBase58(s); - if(!accountID) + if (!accountID) { assert(false); continue; @@ -183,7 +184,8 @@ unsubscribeToAccountsProposed( std::shared_ptr& session, SubscriptionManager& manager) { - boost::json::array const& accounts = request.at("accounts_proposed").as_array(); + boost::json::array const& accounts = + request.at("accounts_proposed").as_array(); for (auto const& account : accounts) { @@ -191,7 +193,7 @@ unsubscribeToAccountsProposed( auto accountID = ripple::parseBase58(s); - if(!accountID) + if (!accountID) { assert(false); continue; @@ -201,7 +203,6 @@ unsubscribeToAccountsProposed( } } - boost::json::object doSubscribe( boost::json::object const& request, @@ -214,16 +215,15 @@ doSubscribe( { boost::json::value error = validateStreams(request); - if(!error.is_null()) + if (!error.is_null()) { response["error"] = error; return response; - } + } } if (request.contains("accounts")) { - if (!request.at("accounts").is_array()) { response["error"] = "accounts must be array"; @@ -233,29 +233,30 @@ doSubscribe( boost::json::array accounts = request.at("accounts").as_array(); boost::json::value error = validateAccounts(request, accounts); - if(!error.is_null()) + if (!error.is_null()) { response["error"] = error; return response; - } + } } if (request.contains("accounts_proposed")) { if (!request.at("accounts_proposed").is_array()) { - response["error"] = "accounts_proposed must be array"; + response["error"] = "accounts_proposed must be array"; return response; } - boost::json::array accounts = request.at("accounts_proposed").as_array(); + boost::json::array accounts = + request.at("accounts_proposed").as_array(); boost::json::value error = validateAccounts(request, accounts); - if(!error.is_null()) + if (!error.is_null()) { response["error"] = error; return response; - } + } } if (request.contains("streams")) @@ -283,11 +284,11 @@ doUnsubscribe( { boost::json::value error = validateStreams(request); - if(!error.is_null()) + if (!error.is_null()) { response["error"] = error; return response; - } + } } if (request.contains("accounts")) @@ -295,23 +296,24 @@ doUnsubscribe( boost::json::array accounts = request.at("accounts").as_array(); boost::json::value error = validateAccounts(request, accounts); - if(!error.is_null()) + if (!error.is_null()) { response["error"] = error; return response; - } + } } if (request.contains("accounts_proposed")) { - boost::json::array accounts = request.at("accounts_proposed").as_array(); + boost::json::array accounts = + request.at("accounts_proposed").as_array(); boost::json::value error = validateAccounts(request, accounts); - if(!error.is_null()) + if (!error.is_null()) { response["error"] = error; return response; - } + } } if (request.contains("streams")) @@ -325,4 +327,4 @@ doUnsubscribe( response["status"] = "success"; return response; -} \ No newline at end of file +} diff --git a/handlers/Tx.cpp b/handlers/Tx.cpp index 3f0353b3..379d916a 100644 --- a/handlers/Tx.cpp +++ b/handlers/Tx.cpp @@ -17,9 +17,8 @@ */ //============================================================================== +#include #include -#include -#include // { // transaction: diff --git a/reporting/P2pProxy.cpp b/reporting/P2pProxy.cpp deleted file mode 100644 index c091eab4..00000000 --- a/reporting/P2pProxy.cpp +++ /dev/null @@ -1,49 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2020 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - -#include -#include - -// We only forward requests where ledger_index is "current" or "closed" -// otherwise, attempt to handle here -bool -shouldForwardToP2p(boost::json::object const& request) -{ - if(request.contains("forward") && request.at("forward").is_bool()) - return request.at("forward").as_bool(); - - std::string strCommand = request.contains("command") - ? request.at("command").as_string().c_str() - : request.at("method").as_string().c_str(); - - if (forwardCommands.find(strCommand) != forwardCommands.end()) - return true; - - if (request.contains("ledger_index")) - { - auto indexValue = request.at("ledger_index"); - if (!indexValue.is_uint64()) - { - std::string index = indexValue.as_string().c_str(); - return index == "current" || index == "closed"; - } - } - - return false; -} diff --git a/reporting/P2pProxy.h b/reporting/P2pProxy.h deleted file mode 100644 index 7309744a..00000000 --- a/reporting/P2pProxy.h +++ /dev/null @@ -1,31 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2020 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - -#ifndef RIPPLE_APP_REPORTING_P2PPROXY_H_INCLUDED -#define RIPPLE_APP_REPORTING_P2PPROXY_H_INCLUDED - -#include - -/// Whether a request should be forwarded, based on request parameters -/// @param request request json -/// @return true if should be forwarded -bool -shouldForwardToP2p(boost::json::object const& request); - -#endif diff --git a/reporting/server/SubscriptionManager.cpp b/server/SubscriptionManager.cpp similarity index 98% rename from reporting/server/SubscriptionManager.cpp rename to server/SubscriptionManager.cpp index 813d2d3c..03517cfc 100644 --- a/reporting/server/SubscriptionManager.cpp +++ b/server/SubscriptionManager.cpp @@ -1,5 +1,5 @@ #include -#include +#include void SubscriptionManager::subLedger(std::shared_ptr& session) diff --git a/reporting/server/SubscriptionManager.h b/server/SubscriptionManager.h similarity index 77% rename from reporting/server/SubscriptionManager.h rename to server/SubscriptionManager.h index 2cea85be..8b241336 100644 --- a/reporting/server/SubscriptionManager.h +++ b/server/SubscriptionManager.h @@ -20,10 +20,10 @@ #ifndef SUBSCRIPTION_MANAGER_H #define SUBSCRIPTION_MANAGER_H -#include +#include -#include #include +#include class session; @@ -35,16 +35,16 @@ class SubscriptionManager Ledgers, Transactions, TransactionsProposed, - + finalEntry }; std::array streamSubscribers_; std::unordered_map accountSubscribers_; - std::unordered_map accountProposedSubscribers_; + std::unordered_map + accountProposedSubscribers_; public: - static std::shared_ptr make_SubscriptionManager() { @@ -71,22 +71,32 @@ public: unsubTransactions(std::shared_ptr& session); void - pubTransaction(Backend::TransactionAndMetadata const& blob, std::uint32_t seq); + pubTransaction( + Backend::TransactionAndMetadata const& blob, + std::uint32_t seq); void - subAccount(ripple::AccountID const& account, std::shared_ptr& session); + subAccount( + ripple::AccountID const& account, + std::shared_ptr& session); void - unsubAccount(ripple::AccountID const& account, std::shared_ptr& session); + unsubAccount( + ripple::AccountID const& account, + std::shared_ptr& session); void forwardProposedTransaction(boost::json::object const& response); void - subProposedAccount(ripple::AccountID const& account, std::shared_ptr& session); + subProposedAccount( + ripple::AccountID const& account, + std::shared_ptr& session); void - unsubProposedAccount(ripple::AccountID const& account, std::shared_ptr& session); + unsubProposedAccount( + ripple::AccountID const& account, + std::shared_ptr& session); void subProposedTransactions(std::shared_ptr& session); @@ -95,4 +105,4 @@ public: unsubProposedTransactions(std::shared_ptr& session); }; -#endif //SUBSCRIPTION_MANAGER_H \ No newline at end of file +#endif // SUBSCRIPTION_MANAGER_H diff --git a/reporting/server/listener.h b/server/listener.h similarity index 98% rename from reporting/server/listener.h rename to server/listener.h index e6dc3915..08eb1d08 100644 --- a/reporting/server/listener.h +++ b/server/listener.h @@ -24,7 +24,7 @@ #include #include -#include +#include #include diff --git a/reporting/server/session.cpp b/server/session.cpp similarity index 81% rename from reporting/server/session.cpp rename to server/session.cpp index c60a4fda..ae0bd14f 100644 --- a/reporting/server/session.cpp +++ b/server/session.cpp @@ -1,5 +1,4 @@ -#include -#include +#include void fail(boost::beast::error_code ec, char const* what) @@ -7,6 +6,31 @@ fail(boost::beast::error_code ec, char const* what) std::cerr << what << ": " << ec.message() << "\n"; } +bool +shouldForwardToRippled(boost::json::object const& request) +{ + if (request.contains("forward") && request.at("forward").is_bool()) + return request.at("forward").as_bool(); + + std::string strCommand = request.contains("command") + ? request.at("command").as_string().c_str() + : request.at("method").as_string().c_str(); + + if (forwardCommands.find(strCommand) != forwardCommands.end()) + return true; + + if (request.contains("ledger_index")) + { + auto indexValue = request.at("ledger_index"); + if (!indexValue.is_uint64()) + { + std::string index = indexValue.as_string().c_str(); + return index == "current" || index == "closed"; + } + } + + return false; +} std::pair buildResponse( boost::json::object const& request, @@ -19,8 +43,8 @@ buildResponse( BOOST_LOG_TRIVIAL(info) << "Received rpc command : " << request; boost::json::object response; - if (shouldForwardToP2p(request)) - return {balancer->forwardToP2p(request), 10}; + if (shouldForwardToRippled(request)) + return {balancer->forwardToRippled(request), 10}; switch (commandMap[command]) { diff --git a/reporting/server/session.h b/server/session.h similarity index 98% rename from reporting/server/session.h rename to server/session.h index f14adc21..c2ca8229 100644 --- a/reporting/server/session.h +++ b/server/session.h @@ -24,10 +24,10 @@ #include #include -#include -#include -#include +#include +#include #include +#include class session; class SubscriptionManager; diff --git a/server/websocket_server_async.cpp b/server/websocket_server_async.cpp index 65e014b3..65f998a1 100644 --- a/server/websocket_server_async.cpp +++ b/server/websocket_server_async.cpp @@ -23,15 +23,15 @@ #include #include #include +#include #include +#include #include #include #include #include -#include -#include -#include -#include +#include +#include #include #include #include diff --git a/unittests/main.cpp b/unittests/main.cpp index e344a03c..55788a19 100644 --- a/unittests/main.cpp +++ b/unittests/main.cpp @@ -1,13 +1,13 @@ #include +#include #include #include -#include #include #include #include -#include -#include +#include +#include // Demonstrate some basic assertions. TEST(BackendTest, Basic)