3#include <xrpl/basics/CountedObject.h>
4#include <xrpl/basics/UnorderedContainers.h>
5#include <xrpl/beast/utility/Journal.h>
6#include <xrpl/json/json_value.h>
7#include <xrpl/protocol/AccountID.h>
8#include <xrpl/protocol/Book.h>
9#include <xrpl/protocol/ErrorCodes.h>
10#include <xrpl/protocol/UintTypes.h>
11#include <xrpl/resource/Consumer.h>
12#include <xrpl/server/Manifest.h>
51[[nodiscard]]
constexpr bool
57 return additional > cap || current > cap - additional;
153 bool historyOnly) = 0;
453 [[nodiscard]]
unsigned int
476 [[nodiscard]]
std::
size_t
A generic endpoint for log messages.
std::shared_ptr< InfoSubRequest > pointer
virtual json::Value doClose()=0
virtual json::Value doStatus(json::Value const &)=0
virtual ~InfoSubRequest()=default
Abstracts the source of subscription data.
virtual void pubPeerStatus(std::function< json::Value(void)> const &)=0
virtual void scheduleAccountCleanup(std::uint64_t seq, HashSet< AccountID > rtAccounts, HashSet< AccountID > normalAccounts, HashSet< AccountID > historyAccounts)=0
Schedule the server-side teardown of a disconnecting connection's account subscriptions off the destr...
virtual void unsubAccountHistoryInternal(std::uint64_t uListener, AccountID const &account, bool historyOnly)=0
virtual bool unsubRTTransactions(std::uint64_t uListener)=0
virtual void pubManifest(Manifest const &)=0
virtual bool unsubConsensus(std::uint64_t uListener)=0
virtual bool unsubTransactions(std::uint64_t uListener)=0
virtual bool subBookChanges(Ref ispListener)=0
virtual bool subServer(Ref ispListener, json::Value &jvResult, bool admin)=0
virtual bool subPeerStatus(Ref ispListener)=0
virtual void unsubAccount(Ref isplistener, HashSet< AccountID > const &vnaAccountIDs, bool realTime)=0
virtual bool unsubServer(std::uint64_t uListener)=0
virtual beast::Journal const & journal() const =0
Journal used by InfoSub for diagnostics that occur after the owning subsystem (e.g.
virtual bool tryRemoveRpcSub(std::string const &strUrl)=0
virtual bool unsubBookChanges(std::uint64_t uListener)=0
virtual bool subRTTransactions(Ref ispListener)=0
virtual bool subTransactions(Ref ispListener)=0
virtual ~Source()=default
virtual bool unsubLedger(std::uint64_t uListener)=0
virtual void subAccount(Ref ispListener, HashSet< AccountID > const &vnaAccountIDs, bool realTime)=0
virtual bool subManifests(Ref ispListener)=0
virtual bool unsubPeerStatus(std::uint64_t uListener)=0
virtual bool subBook(Ref ispListener, Book const &)=0
virtual ErrorCodeI subAccountHistory(Ref ispListener, AccountID const &account)=0
subscribe an account's new transactions and retrieve the account's historical transactions
virtual bool unsubBook(Ref ispListener, Book const &)=0
Remove a book subscription for a live subscriber.
virtual bool unsubManifests(std::uint64_t uListener)=0
virtual void unsubAccountInternal(std::uint64_t uListener, HashSet< AccountID > const &vnaAccountIDs, bool realTime)=0
virtual bool subLedger(Ref ispListener, json::Value &jvResult)=0
virtual void unsubMPT(InfoSub::Ref ispListener, HashSet< MPTID > const &mptIDs)=0
virtual void unsubMPTInternal(std::uint64_t uListener, MPTID const &mptID)=0
Remove an MPT issuance subscription during InfoSub teardown.
virtual bool unsubBookInternal(std::uint64_t uListener, Book const &)=0
Remove a book subscription during InfoSub teardown.
virtual bool unsubValidations(std::uint64_t uListener)=0
virtual pointer findRpcSub(std::string const &strUrl)=0
virtual void subMPT(InfoSub::Ref ispListener, HashSet< MPTID > const &mptIDs)=0
virtual bool subValidations(Ref ispListener)=0
virtual void unsubAccountHistory(Ref ispListener, AccountID const &account, bool historyOnly)=0
unsubscribe an account's transactions
virtual pointer addRpcSub(std::string const &strUrl, Ref rspEntry)=0
virtual bool subConsensus(Ref ispListener)=0
void setRequest(std::shared_ptr< InfoSubRequest > const &req)
void insertBookSubscription(Book const &book)
Record that this subscriber is following book.
std::shared_ptr< InfoSub > const & Ref
virtual void send(json::Value const &jvObj, bool broadcast)=0
std::shared_ptr< InfoSub > pointer
bool insertSubAccountHistory(AccountID const &account)
bool tryReserveMPTSubscriptions(HashSet< MPTID > const &mptIDs, std::size_t cap)
Enforce the cap and reserve a request's net-new MPT issuances, atomically.
HashSet< MPTID > mptSubscriptions_
bool tryReserveAccountSubscriptions(HashSet< AccountID > const &proposedAccounts, HashSet< AccountID > const &normalAccounts, std::size_t cap)
Enforce the cap and reserve a request's net-new accounts, atomically.
void deleteSubMPTInfo(MPTID const &mptID)
std::size_t totalSubscriptionCount() const
Return the number of subscriptions currently tracked on this connection.
void setApiVersion(unsigned int apiVersion)
std::uint64_t getSeq() const
HashSet< AccountID > realTimeSubscriptions_
std::scoped_lock< decltype(lock_)> ScopedLock
resource::Consumer Consumer
void insertSubAccountInfo(AccountID const &account, bool rt)
std::size_t subscriptionCount(ScopedLock const &lock) const
The combined tally the per-connection cap is enforced against.
void deleteBookSubscription(Book const &book)
Stop tracking book for this subscriber.
bool hasAccountHistorySubscription(AccountID const &account) const
Whether this connection already tracks an account-history for account.
HashSet< AccountID > normalSubscriptions_
HashSet< Book > bookSubscriptions_
void insertSubMPTInfo(MPTID const &mptID)
HashSet< AccountID > accountHistorySubscriptions_
void deleteSubAccountInfo(AccountID const &account, bool rt)
void deleteSubAccountHistory(AccountID const &account)
unsigned int getApiVersion() const noexcept
std::weak_ptr< InfoSub > Wptr
std::shared_ptr< InfoSubRequest > const & getRequest()
std::shared_ptr< InfoSubRequest > request_
An endpoint that consumes resources.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
BaseUInt< 192 > MPTID
MPTID is a 192-bit value representing MPT Issuance ID, which is a concatenation of a 32-bit sequence ...
std::unordered_set< Value, Hash, Pred, Allocator > HashSet
constexpr std::size_t kMaxSubscriptionsPerConnection
Maximum number of subscriptions a single client connection may hold at once.
BaseUInt< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
constexpr bool exceedsSubscriptionCap(std::size_t current, std::size_t additional, std::size_t cap=kMaxSubscriptionsPerConnection)
Whether adding additional subscriptions to a connection already holding current would exceed the cap.