Clio develop
The XRP Ledger API server.
Loading...
Searching...
No Matches
Subscribe.hpp
1//------------------------------------------------------------------------------
2/*
3 This file is part of clio: https://github.com/XRPLF/clio
4 Copyright (c) 2023, the clio developers.
5
6 Permission to use, copy, modify, and 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#pragma once
21
22#include "data/AmendmentCenterInterface.hpp"
23#include "data/BackendInterface.hpp"
24#include "feed/SubscriptionManagerInterface.hpp"
25#include "feed/Types.hpp"
26#include "rpc/common/Specs.hpp"
27#include "rpc/common/Types.hpp"
28
29#include <boost/asio/spawn.hpp>
30#include <boost/json/array.hpp>
31#include <boost/json/conversion.hpp>
32#include <boost/json/object.hpp>
33#include <boost/json/value.hpp>
34#include <boost/json/value_to.hpp>
35#include <xrpl/beast/utility/Zero.h>
36#include <xrpl/protocol/Book.h>
37#include <xrpl/protocol/ErrorCodes.h>
38#include <xrpl/protocol/jss.h>
39
40#include <cstdint>
41#include <memory>
42#include <optional>
43#include <string>
44#include <vector>
45
46namespace rpc {
47
56 std::shared_ptr<BackendInterface> sharedPtrBackend_;
57 std::shared_ptr<data::AmendmentCenterInterface const> amendmentCenter_;
58 std::shared_ptr<feed::SubscriptionManagerInterface> subscriptions_;
59
60public:
64 struct Output {
65 // response of stream "ledger"
66 // TODO: use better type than json, this type will be used in the stream as well
67 std::optional<boost::json::object> ledger;
68 // books returns nothing by default, if snapshot is true and both is false, offers go to offers list
69 // TODO: use better type than json
70 std::optional<boost::json::array> offers;
71 // if snapshot is true and both is true, reversed book' offers go to asks list
72 std::optional<boost::json::array> asks;
73 // if snapshot is true and both is true, original book' offers go to bids list
74 std::optional<boost::json::array> bids;
75 };
76
80 struct OrderBook {
81 ripple::Book book;
82 std::optional<std::string> taker;
83 bool snapshot = false;
84 bool both = false;
85 };
86
90 struct Input {
91 std::optional<std::vector<std::string>> accounts;
92 std::optional<std::vector<std::string>> streams;
93 std::optional<std::vector<std::string>> accountsProposed;
94 std::optional<std::vector<OrderBook>> books;
95 };
96
97 using Result = HandlerReturnType<Output>;
98
107 std::shared_ptr<BackendInterface> const& sharedPtrBackend,
108 std::shared_ptr<data::AmendmentCenterInterface const> const& amendmentCenter,
109 std::shared_ptr<feed::SubscriptionManagerInterface> const& subscriptions
110 );
111
118 static RpcSpecConstRef
119 spec([[maybe_unused]] uint32_t apiVersion);
120
128 Result
129 process(Input input, Context const& ctx) const;
130
131private:
132 boost::json::object
133 subscribeToStreams(
134 boost::asio::yield_context yield,
135 std::vector<std::string> const& streams,
136 feed::SubscriberSharedPtr const& session
137 ) const;
138
139 void
140 subscribeToAccounts(std::vector<std::string> const& accounts, feed::SubscriberSharedPtr const& session) const;
141
142 void
143 subscribeToAccountsProposed(std::vector<std::string> const& accounts, feed::SubscriberSharedPtr const& session)
144 const;
145
146 void
147 subscribeToBooks(
148 std::vector<OrderBook> const& books,
149 feed::SubscriberSharedPtr const& session,
150 boost::asio::yield_context yield,
151 Output& output
152 ) const;
153
160 friend void
161 tag_invoke(boost::json::value_from_tag, boost::json::value& jv, Output const& output);
162
169 friend Input
170 tag_invoke(boost::json::value_to_tag<Input>, boost::json::value const& jv);
171};
172
173} // namespace rpc
Contains functionality for handling the subscribe command. The subscribe method requests periodic not...
Definition Subscribe.hpp:55
static RpcSpecConstRef spec(uint32_t apiVersion)
Returns the API specification for the command.
Definition Subscribe.cpp:67
Result process(Input input, Context const &ctx) const
Process the Subscribe command.
Definition Subscribe.cpp:116
SubscribeHandler(std::shared_ptr< BackendInterface > const &sharedPtrBackend, std::shared_ptr< data::AmendmentCenterInterface const > const &amendmentCenter, std::shared_ptr< feed::SubscriptionManagerInterface > const &subscriptions)
Construct a new BaseSubscribeHandler object.
Definition Subscribe.cpp:57
friend void tag_invoke(boost::json::value_from_tag, boost::json::value &jv, Output const &output)
Convert output to json value.
Definition Subscribe.cpp:249
This namespace contains all the RPC logic and handlers.
Definition AMMHelpers.cpp:37
RpcSpec const & RpcSpecConstRef
An alias for a const reference to RpcSpec.
Definition Specs.hpp:145
std::expected< OutputType, Status > HandlerReturnType
Return type for each individual handler.
Definition Types.hpp:81
Context of an RPC call.
Definition Types.hpp:118
A struct to hold the input data for the command.
Definition Subscribe.hpp:90
A struct to hold the data for one order book.
Definition Subscribe.hpp:80
A struct to hold the output data of the command.
Definition Subscribe.hpp:64