Clio  develop
The XRP Ledger API server.
Loading...
Searching...
No Matches
TransactionFeed.hpp
1#pragma once
2
3#include "data/AmendmentCenterInterface.hpp"
4#include "data/BackendInterface.hpp"
5#include "data/Types.hpp"
6#include "feed/Types.hpp"
7#include "feed/impl/TrackableSignal.hpp"
8#include "feed/impl/TrackableSignalMap.hpp"
9#include "feed/impl/Util.hpp"
10#include "util/async/AnyExecutionContext.hpp"
11#include "util/async/AnyStrand.hpp"
12#include "util/log/Logger.hpp"
13#include "util/prometheus/Gauge.hpp"
14
15#include <boost/asio/io_context.hpp>
16#include <boost/asio/strand.hpp>
17#include <fmt/format.h>
18#include <xrpl/protocol/AccountID.h>
19#include <xrpl/protocol/Book.h>
20#include <xrpl/protocol/LedgerHeader.h>
21#include <xrpl/protocol/MPTIssue.h> // IWYU pragma: keep (std::hash<xrpl::MPTID>)
22#include <xrpl/protocol/UintTypes.h>
23
24#include <cstdint>
25#include <functional>
26#include <memory>
27#include <string>
28#include <unordered_set>
29
30namespace feed::impl {
31
33 // Hold two versions of transaction messages
34 struct AllVersionsMsgsType {
35 std::string v1;
36 std::string v2;
37 };
38
39 struct TransactionSlot {
40 std::reference_wrapper<TransactionFeed> feed;
41 std::weak_ptr<Subscriber> subscriptionContextWeakPtr;
42
43 TransactionSlot(TransactionFeed& feed, SubscriberSharedPtr const& connection)
44 : feed(feed), subscriptionContextWeakPtr(connection)
45 {
46 }
47
48 void
49 operator()(std::shared_ptr<AllVersionsMsgsType> const& allVersionMsgs) const;
50 };
51
52 util::Logger logger_{"Subscriptions"};
53
55 std::reference_wrapper<util::prometheus::GaugeInt> subAllCount_;
56 std::reference_wrapper<util::prometheus::GaugeInt> subAccountCount_;
57 std::reference_wrapper<util::prometheus::GaugeInt> subBookCount_;
58 std::reference_wrapper<util::prometheus::GaugeInt> subMPTIssuanceCount_;
59
61 accountSignal_;
63 bookSignal_;
65 mptIssuanceSignal_;
67
68 // Signals for proposed tx subscribers
70 accountProposedSignal_;
72
73 std::unordered_set<SubscriberPtr> notified_; // Used by slots to prevent double notifications
74 // if tx contains multiple subscribed accounts
75
76public:
82 : strand_(executionCtx.makeStrand())
83 , subAllCount_(getSubscriptionsGaugeInt("tx"))
84 , subAccountCount_(getSubscriptionsGaugeInt("account"))
85 , subBookCount_(getSubscriptionsGaugeInt("book"))
86 , subMPTIssuanceCount_(getSubscriptionsGaugeInt("mpt_issuance"))
87 {
88 }
89
94
99 void
100 sub(SubscriberSharedPtr const& subscriber);
101
108 void
109 sub(xrpl::AccountID const& account, SubscriberSharedPtr const& subscriber);
110
117 void
118 sub(xrpl::Book const& book, SubscriberSharedPtr const& subscriber);
119
126 void
127 sub(xrpl::MPTID const& mptIssuanceID, SubscriberSharedPtr const& subscriber);
128
133 void
134 subProposed(SubscriberSharedPtr const& subscriber);
135
142 void
143 subProposed(xrpl::AccountID const& account, SubscriberSharedPtr const& subscriber);
144
149 void
150 unsub(SubscriberSharedPtr const& subscriber);
151
157 void
158 unsub(xrpl::AccountID const& account, SubscriberSharedPtr const& subscriber);
159
164 void
165 unsubProposed(SubscriberSharedPtr const& subscriber);
166
172 void
173 unsubProposed(xrpl::AccountID const& account, SubscriberSharedPtr const& subscriber);
174
180 void
181 unsub(xrpl::Book const& book, SubscriberSharedPtr const& subscriber);
182
188 void
189 unsub(xrpl::MPTID const& mptIssuanceID, SubscriberSharedPtr const& subscriber);
190
198 void
199 pub(data::TransactionAndMetadata const& txMeta,
200 xrpl::LedgerHeader const& lgrInfo,
201 std::shared_ptr<data::BackendInterface const> const& backend,
202 std::shared_ptr<data::AmendmentCenterInterface const> const& amendmentCenter,
203 uint32_t networkID);
204
208 std::uint64_t
209 transactionSubCount() const;
210
214 std::uint64_t
215 accountSubCount() const;
216
220 std::uint64_t
221 bookSubCount() const;
222
226 std::uint64_t
227 mptIssuanceSubCount() const;
228
229private:
230 void
231 unsubInternal(SubscriberPtr subscriber);
232
233 void
234 unsubInternal(xrpl::AccountID const& account, SubscriberPtr subscriber);
235
236 void
237 unsubProposedInternal(SubscriberPtr subscriber);
238
239 void
240 unsubProposedInternal(xrpl::AccountID const& account, SubscriberPtr subscriber);
241
242 void
243 unsubInternal(xrpl::Book const& book, SubscriberPtr subscriber);
244
245 void
246 unsubInternal(xrpl::MPTID const& mptIssuanceID, SubscriberPtr subscriber);
247};
248} // namespace feed::impl
Class to manage a map of key and its associative signal.
Definition TrackableSignalMap.hpp:30
A thread-safe class to manage a signal and its tracking connections.
Definition TrackableSignal.hpp:26
void unsub(SubscriberSharedPtr const &subscriber)
Unsubscribe to the transaction feed.
Definition TransactionFeed.cpp:144
void sub(SubscriberSharedPtr const &subscriber)
Subscribe to the transaction feed.
Definition TransactionFeed.cpp:64
void unsubProposed(SubscriberSharedPtr const &subscriber)
Unsubscribe to the transaction feed for proposed transaction stream.
Definition TransactionFeed.cpp:156
std::uint64_t bookSubCount() const
Get the number of books subscribers.
Definition TransactionFeed.cpp:195
std::uint64_t transactionSubCount() const
Get the number of subscribers of the transaction feed.
Definition TransactionFeed.cpp:183
std::uint64_t mptIssuanceSubCount() const
Get the number of MPT issuances subscribers.
Definition TransactionFeed.cpp:201
TransactionFeed(TransactionFeed &&)=delete
Move constructor is deleted because TransactionSlot takes TransactionFeed by reference.
std::uint64_t accountSubCount() const
Get the number of accounts subscribers.
Definition TransactionFeed.cpp:189
void pub(data::TransactionAndMetadata const &txMeta, xrpl::LedgerHeader const &lgrInfo, std::shared_ptr< data::BackendInterface const > const &backend, std::shared_ptr< data::AmendmentCenterInterface const > const &amendmentCenter, uint32_t networkID)
Publishes the transaction feed.
Definition TransactionFeed.cpp:207
TransactionFeed(util::async::AnyExecutionContext &executionCtx)
Construct a new Transaction Feed object.
Definition TransactionFeed.hpp:81
void subProposed(SubscriberSharedPtr const &subscriber)
Subscribe to the transaction feed for proposed transaction stream.
Definition TransactionFeed.cpp:90
A simple thread-safe logger for the channel specified in the constructor.
Definition Logger.hpp:78
A type-erased execution context.
Definition AnyExecutionContext.hpp:23
A type-erased execution context.
Definition AnyStrand.hpp:22
This namespace implements everything related to subscriptions.
Definition BookChangesFeed.hpp:14
Represents a transaction and its metadata bundled together.
Definition Types.hpp:49