rippled
InfoSub.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #ifndef RIPPLE_NET_INFOSUB_H_INCLUDED
21 #define RIPPLE_NET_INFOSUB_H_INCLUDED
22 
23 #include <ripple/app/misc/Manifest.h>
24 #include <ripple/basics/CountedObject.h>
25 #include <ripple/json/json_value.h>
26 #include <ripple/protocol/Book.h>
27 #include <ripple/protocol/ErrorCodes.h>
28 #include <ripple/resource/Consumer.h>
29 #include <mutex>
30 
31 namespace ripple {
32 
33 // Operations that clients may wish to perform against the network
34 // Master operational handler, server sequencer, network tracker
35 
37 {
38 public:
40 
41  virtual ~InfoSubRequest() = default;
42 
43  virtual Json::Value
44  doClose() = 0;
45  virtual Json::Value
46  doStatus(Json::Value const&) = 0;
47 };
48 
51 class InfoSub : public CountedObject<InfoSub>
52 {
53 public:
55 
56  // VFALCO TODO Standardize on the names of weak / strong pointer type
57  // aliases.
59 
60  using ref = const std::shared_ptr<InfoSub>&;
61 
63 
64 public:
67  class Source
68  {
69  public:
70  virtual ~Source() = default;
71 
72  // For some reason, these were originally called "rt"
73  // for "real time". They actually refer to whether
74  // you get transactions as they occur or once their
75  // results are confirmed
76  virtual void
77  subAccount(
78  ref ispListener,
79  hash_set<AccountID> const& vnaAccountIDs,
80  bool realTime) = 0;
81 
82  // for normal use, removes from InfoSub and server
83  virtual void
85  ref isplistener,
86  hash_set<AccountID> const& vnaAccountIDs,
87  bool realTime) = 0;
88 
89  // for use during InfoSub destruction
90  // Removes only from the server
91  virtual void
93  std::uint64_t uListener,
94  hash_set<AccountID> const& vnaAccountIDs,
95  bool realTime) = 0;
96 
102  virtual error_code_i
103  subAccountHistory(ref ispListener, AccountID const& account) = 0;
104 
113  virtual void
115  ref ispListener,
116  AccountID const& account,
117  bool historyOnly) = 0;
118 
119  virtual void
121  std::uint64_t uListener,
122  AccountID const& account,
123  bool historyOnly) = 0;
124 
125  // VFALCO TODO Document the bool return value
126  virtual bool
127  subLedger(ref ispListener, Json::Value& jvResult) = 0;
128  virtual bool
129  unsubLedger(std::uint64_t uListener) = 0;
130 
131  virtual bool
132  subBookChanges(ref ispListener) = 0;
133  virtual bool
134  unsubBookChanges(std::uint64_t uListener) = 0;
135 
136  virtual bool
137  subManifests(ref ispListener) = 0;
138  virtual bool
139  unsubManifests(std::uint64_t uListener) = 0;
140  virtual void
141  pubManifest(Manifest const&) = 0;
142 
143  virtual bool
144  subServer(ref ispListener, Json::Value& jvResult, bool admin) = 0;
145  virtual bool
146  unsubServer(std::uint64_t uListener) = 0;
147 
148  virtual bool
149  subBook(ref ispListener, Book const&) = 0;
150  virtual bool
151  unsubBook(std::uint64_t uListener, Book const&) = 0;
152 
153  virtual bool
154  subTransactions(ref ispListener) = 0;
155  virtual bool
156  unsubTransactions(std::uint64_t uListener) = 0;
157 
158  virtual bool
159  subRTTransactions(ref ispListener) = 0;
160  virtual bool
161  unsubRTTransactions(std::uint64_t uListener) = 0;
162 
163  virtual bool
164  subValidations(ref ispListener) = 0;
165  virtual bool
166  unsubValidations(std::uint64_t uListener) = 0;
167 
168  virtual bool
169  subPeerStatus(ref ispListener) = 0;
170  virtual bool
171  unsubPeerStatus(std::uint64_t uListener) = 0;
172  virtual void
173  pubPeerStatus(std::function<Json::Value(void)> const&) = 0;
174 
175  virtual bool
176  subConsensus(ref ispListener) = 0;
177  virtual bool
178  unsubConsensus(std::uint64_t uListener) = 0;
179 
180  // VFALCO TODO Remove
181  // This was added for one particular partner, it
182  // "pushes" subscription data to a particular URL.
183  //
184  virtual pointer
185  findRpcSub(std::string const& strUrl) = 0;
186  virtual pointer
187  addRpcSub(std::string const& strUrl, ref rspEntry) = 0;
188  virtual bool
189  tryRemoveRpcSub(std::string const& strUrl) = 0;
190  };
191 
192 public:
193  InfoSub(Source& source);
194  InfoSub(Source& source, Consumer consumer);
195 
196  virtual ~InfoSub();
197 
198  Consumer&
199  getConsumer();
200 
201  virtual void
202  send(Json::Value const& jvObj, bool broadcast) = 0;
203 
205  getSeq();
206 
207  void
208  onSendEmpty();
209 
210  void
211  insertSubAccountInfo(AccountID const& account, bool rt);
212 
213  void
214  deleteSubAccountInfo(AccountID const& account, bool rt);
215 
216  // return false if already subscribed to this account
217  bool
218  insertSubAccountHistory(AccountID const& account);
219 
220  void
221  deleteSubAccountHistory(AccountID const& account);
222 
223  void
224  clearRequest();
225 
226  void
228 
230  getRequest();
231 
232 protected:
234 
235 private:
243 
244  static int
246  {
247  static std::atomic<std::uint64_t> id(0);
248  return ++id;
249  }
250 };
251 
252 } // namespace ripple
253 
254 #endif
ripple::InfoSub::m_consumer
Consumer m_consumer
Definition: InfoSub.h:236
ripple::InfoSub::~InfoSub
virtual ~InfoSub()
Definition: InfoSub.cpp:45
ripple::InfoSub::getRequest
std::shared_ptr< InfoSubRequest > const & getRequest()
Definition: InfoSub.cpp:134
ripple::CountedObject
Tracks the number of instances of an object.
Definition: CountedObject.h:124
std::string
STL class.
std::shared_ptr
STL class.
ripple::InfoSub::realTimeSubscriptions_
hash_set< AccountID > realTimeSubscriptions_
Definition: InfoSub.h:238
ripple::InfoSubRequest
Definition: InfoSub.h:36
ripple::InfoSub::Source::unsubTransactions
virtual bool unsubTransactions(std::uint64_t uListener)=0
ripple::InfoSub::Source::pubManifest
virtual void pubManifest(Manifest const &)=0
ripple::Manifest
Definition: Manifest.h:80
ripple::InfoSub::Source::unsubConsensus
virtual bool unsubConsensus(std::uint64_t uListener)=0
std::unordered_set
STL class.
ripple::InfoSub
Manages a client's subscription to data feeds.
Definition: InfoSub.h:51
ripple::InfoSub::send
virtual void send(Json::Value const &jvObj, bool broadcast)=0
ripple::InfoSub::Source::subValidations
virtual bool subValidations(ref ispListener)=0
ripple::InfoSub::insertSubAccountInfo
void insertSubAccountInfo(AccountID const &account, bool rt)
Definition: InfoSub.cpp:86
ripple::InfoSub::normalSubscriptions_
hash_set< AccountID > normalSubscriptions_
Definition: InfoSub.h:239
ripple::InfoSubRequest::doClose
virtual Json::Value doClose()=0
ripple::InfoSub::Source::subBookChanges
virtual bool subBookChanges(ref ispListener)=0
ripple::InfoSub::clearRequest
void clearRequest()
Definition: InfoSub.cpp:122
std::function
ripple::InfoSub::assign_id
static int assign_id()
Definition: InfoSub.h:245
ripple::InfoSub::Source::subRTTransactions
virtual bool subRTTransactions(ref ispListener)=0
ripple::InfoSub::Source::subTransactions
virtual bool subTransactions(ref ispListener)=0
ripple::InfoSub::Source::subAccountHistory
virtual error_code_i subAccountHistory(ref ispListener, AccountID const &account)=0
subscribe an account's new transactions and retrieve the account's historical transactions
ripple::InfoSub::Source::unsubAccountInternal
virtual void unsubAccountInternal(std::uint64_t uListener, hash_set< AccountID > const &vnaAccountIDs, bool realTime)=0
ripple::InfoSub::Source::unsubValidations
virtual bool unsubValidations(std::uint64_t uListener)=0
ripple::error_code_i
error_code_i
Definition: ErrorCodes.h:40
ripple::InfoSub::Source::subBook
virtual bool subBook(ref ispListener, Book const &)=0
ripple::InfoSub::Source::findRpcSub
virtual pointer findRpcSub(std::string const &strUrl)=0
ripple::InfoSub::mLock
std::mutex mLock
Definition: InfoSub.h:233
ripple::InfoSub::Source::subManifests
virtual bool subManifests(ref ispListener)=0
ripple::base_uint< 160, detail::AccountIDTag >
ripple::InfoSub::Source::unsubAccountHistoryInternal
virtual void unsubAccountHistoryInternal(std::uint64_t uListener, AccountID const &account, bool historyOnly)=0
ripple::InfoSub::Source::subLedger
virtual bool subLedger(ref ispListener, Json::Value &jvResult)=0
ripple::InfoSub::Source::unsubBook
virtual bool unsubBook(std::uint64_t uListener, Book const &)=0
ripple::InfoSub::Source::unsubAccountHistory
virtual void unsubAccountHistory(ref ispListener, AccountID const &account, bool historyOnly)=0
unsubscribe an account's transactions
ripple::InfoSub::Source::pubPeerStatus
virtual void pubPeerStatus(std::function< Json::Value(void)> const &)=0
ripple::InfoSub::Source
Abstracts the source of subscription data.
Definition: InfoSub.h:67
ripple::InfoSub::Source::addRpcSub
virtual pointer addRpcSub(std::string const &strUrl, ref rspEntry)=0
ripple::InfoSub::deleteSubAccountInfo
void deleteSubAccountInfo(AccountID const &account, bool rt)
Definition: InfoSub.cpp:97
ripple::InfoSub::Source::unsubAccount
virtual void unsubAccount(ref isplistener, hash_set< AccountID > const &vnaAccountIDs, bool realTime)=0
std::uint64_t
ripple::InfoSub::Source::unsubRTTransactions
virtual bool unsubRTTransactions(std::uint64_t uListener)=0
ripple::InfoSub::Source::~Source
virtual ~Source()=default
std::atomic< std::uint64_t >
ripple::InfoSub::Source::unsubPeerStatus
virtual bool unsubPeerStatus(std::uint64_t uListener)=0
ripple::InfoSubRequest::doStatus
virtual Json::Value doStatus(Json::Value const &)=0
std::weak_ptr< InfoSub >
ripple::InfoSub::Source::unsubServer
virtual bool unsubServer(std::uint64_t uListener)=0
ripple::InfoSub::setRequest
void setRequest(const std::shared_ptr< InfoSubRequest > &req)
Definition: InfoSub.cpp:128
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::InfoSubRequest::~InfoSubRequest
virtual ~InfoSubRequest()=default
ripple::InfoSub::deleteSubAccountHistory
void deleteSubAccountHistory(AccountID const &account)
Definition: InfoSub.cpp:115
ripple::InfoSub::insertSubAccountHistory
bool insertSubAccountHistory(AccountID const &account)
Definition: InfoSub.cpp:108
ripple::InfoSub::Source::unsubBookChanges
virtual bool unsubBookChanges(std::uint64_t uListener)=0
ripple::InfoSub::getSeq
std::uint64_t getSeq()
Definition: InfoSub.cpp:75
ripple::InfoSub::Source::unsubManifests
virtual bool unsubManifests(std::uint64_t uListener)=0
ripple::InfoSub::Source::tryRemoveRpcSub
virtual bool tryRemoveRpcSub(std::string const &strUrl)=0
ripple::InfoSub::m_source
Source & m_source
Definition: InfoSub.h:237
ripple::Resource::Consumer
An endpoint that consumes resources.
Definition: Consumer.h:34
ripple::InfoSub::mSeq
std::uint64_t mSeq
Definition: InfoSub.h:241
mutex
ripple::InfoSub::getConsumer
Consumer & getConsumer()
Definition: InfoSub.cpp:69
ripple::Book
Specifies an order book.
Definition: Book.h:33
ripple::InfoSub::accountHistorySubscriptions_
hash_set< AccountID > accountHistorySubscriptions_
Definition: InfoSub.h:242
ripple::InfoSub::Source::subConsensus
virtual bool subConsensus(ref ispListener)=0
ripple::InfoSub::Source::subPeerStatus
virtual bool subPeerStatus(ref ispListener)=0
ripple::InfoSub::request_
std::shared_ptr< InfoSubRequest > request_
Definition: InfoSub.h:240
ripple::InfoSub::onSendEmpty
void onSendEmpty()
Definition: InfoSub.cpp:81
ripple::InfoSub::Source::subServer
virtual bool subServer(ref ispListener, Json::Value &jvResult, bool admin)=0
ripple::InfoSub::Source::subAccount
virtual void subAccount(ref ispListener, hash_set< AccountID > const &vnaAccountIDs, bool realTime)=0
ripple::InfoSub::InfoSub
InfoSub(Source &source)
Definition: InfoSub.cpp:36
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::InfoSub::Source::unsubLedger
virtual bool unsubLedger(std::uint64_t uListener)=0