Clio  develop
The XRP Ledger API server.
Loading...
Searching...
No Matches
WsConnection.hpp
1#pragma once
2
3#include "util/log/Logger.hpp"
4#include "util/requests/Types.hpp"
5
6#include <boost/asio/bind_cancellation_slot.hpp>
7#include <boost/asio/cancellation_signal.hpp>
8#include <boost/asio/cancellation_type.hpp>
9#include <boost/asio/io_context.hpp>
10#include <boost/asio/spawn.hpp>
11#include <boost/beast/core/tcp_stream.hpp>
12#include <boost/beast/websocket/stream.hpp>
13
14#include <chrono>
15#include <expected>
16#include <memory>
17#include <optional>
18#include <string>
19#include <utility>
20#include <vector>
21
22namespace util::requests {
23
31public:
32 virtual ~WsConnection() = default;
33
41 virtual std::expected<std::string, RequestError>
43 boost::asio::yield_context yield,
44 std::optional<std::chrono::steady_clock::duration> timeout = std::nullopt
45 ) = 0;
46
55 virtual std::optional<RequestError>
57 std::string const& message,
58 boost::asio::yield_context yield,
59 std::optional<std::chrono::steady_clock::duration> timeout = std::nullopt
60 ) = 0;
61
69 virtual std::optional<RequestError>
71 boost::asio::yield_context yield,
72 std::chrono::steady_clock::duration timeout = kDefaultTimeout
73 ) = 0;
74
75 static constexpr std::chrono::seconds kDefaultTimeout{5};
76};
77using WsConnectionPtr = std::unique_ptr<WsConnection>;
78
83 util::Logger log_{"WsConnectionBuilder"};
84 std::string host_;
85 std::string port_;
86 std::vector<HttpHeader> headers_;
87 std::chrono::steady_clock::duration connectionTimeout_{kDefaultTimeout};
88 std::chrono::steady_clock::duration wsHandshakeTimeout_{kDefaultTimeout};
89 std::string target_{"/"};
90
91public:
98 WsConnectionBuilder(std::string host, std::string port);
99
107 addHeader(HttpHeader header);
108
116 addHeaders(std::vector<HttpHeader> headers);
117
125 setTarget(std::string target);
126
134 setConnectionTimeout(std::chrono::steady_clock::duration timeout);
135
143 setWsHandshakeTimeout(std::chrono::steady_clock::duration timeout);
144
151 [[nodiscard]] std::expected<WsConnectionPtr, RequestError>
152 sslConnect(boost::asio::yield_context yield) const;
153
160 [[nodiscard]] std::expected<WsConnectionPtr, RequestError>
161 plainConnect(boost::asio::yield_context yield) const;
162
169 [[nodiscard]] std::expected<WsConnectionPtr, RequestError>
170 connect(boost::asio::yield_context yield) const;
171
172 static constexpr std::chrono::seconds kDefaultTimeout{5};
173
174private:
175 template <typename StreamDataType>
176 std::expected<WsConnectionPtr, RequestError>
177 connectImpl(StreamDataType&& streamData, boost::asio::yield_context yield) const;
178};
179
180} // namespace util::requests
A simple thread-safe logger for the channel specified in the constructor.
Definition Logger.hpp:78
static constexpr std::chrono::seconds kDefaultTimeout
Definition WsConnection.hpp:172
std::expected< WsConnectionPtr, RequestError > connect(boost::asio::yield_context yield) const
Connect to the host trying SSL first then plain if SSL fails.
Definition WsConnection.cpp:106
std::expected< WsConnectionPtr, RequestError > plainConnect(boost::asio::yield_context yield) const
Connect to the host without SSL asynchronously.
Definition WsConnection.cpp:100
WsConnectionBuilder(std::string host, std::string port)
Create a new connection builder.
Definition WsConnection.cpp:35
WsConnectionBuilder & setConnectionTimeout(std::chrono::steady_clock::duration timeout)
Set the timeout for connection establishing operations. Default is 5 seconds.
Definition WsConnection.cpp:66
WsConnectionBuilder & setTarget(std::string target)
Set the target of the request.
Definition WsConnection.cpp:59
WsConnectionBuilder & addHeader(HttpHeader header)
Add a header to the request.
Definition WsConnection.cpp:41
std::expected< WsConnectionPtr, RequestError > sslConnect(boost::asio::yield_context yield) const
Connect to the host using SSL asynchronously.
Definition WsConnection.cpp:80
WsConnectionBuilder & setWsHandshakeTimeout(std::chrono::steady_clock::duration timeout)
Set the timeout for WebSocket handshake. Default is 5 seconds.
Definition WsConnection.cpp:73
WsConnectionBuilder & addHeaders(std::vector< HttpHeader > headers)
Add multiple headers to the request.
Definition WsConnection.cpp:48
Interface for WebSocket connections. It is used to hide SSL and plain connections behind the same int...
Definition WsConnection.hpp:30
virtual std::optional< RequestError > write(std::string const &message, boost::asio::yield_context yield, std::optional< std::chrono::steady_clock::duration > timeout=std::nullopt)=0
Write a message to the WebSocket.
static constexpr std::chrono::seconds kDefaultTimeout
Definition WsConnection.hpp:75
virtual std::optional< RequestError > close(boost::asio::yield_context yield, std::chrono::steady_clock::duration timeout=kDefaultTimeout)=0
Close the WebSocket.
virtual std::expected< std::string, RequestError > read(boost::asio::yield_context yield, std::optional< std::chrono::steady_clock::duration > timeout=std::nullopt)=0
Read a message from the WebSocket.
HTTP header.
Definition Types.hpp:51