Files
rippled/include/xrpl/server/WSSession.h
Bart 1d42c4f6de refactor: Remove unnecessary copyright notices already covered by LICENSE.md (#5929)
Per XLS-0095, we are taking steps to rename ripple(d) to xrpl(d).

This change specifically removes all copyright notices referencing Ripple, XRPLF, and certain affiliated contributors upon mutual agreement, so the notice in the LICENSE.md file applies throughout. Copyright notices referencing external contributions remain as-is. Duplicate verbiage is also removed.
2025-11-04 08:33:42 +00:00

131 lines
3.1 KiB
C++

#ifndef XRPL_SERVER_WSSESSION_H_INCLUDED
#define XRPL_SERVER_WSSESSION_H_INCLUDED
#include <xrpl/server/Handoff.h>
#include <xrpl/server/Port.h>
#include <xrpl/server/Writer.h>
#include <boost/asio/buffer.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/beast/core/buffers_prefix.hpp>
#include <boost/beast/websocket/rfc6455.hpp>
#include <boost/logic/tribool.hpp>
#include <algorithm>
#include <functional>
#include <memory>
#include <utility>
#include <vector>
namespace ripple {
class WSMsg
{
public:
WSMsg() = default;
WSMsg(WSMsg const&) = delete;
WSMsg&
operator=(WSMsg const&) = delete;
virtual ~WSMsg() = default;
/** Retrieve message data.
Returns a tribool indicating whether or not
data is available, and a ConstBufferSequence
representing the data.
tribool values:
maybe: Data is not ready yet
false: Data is available
true: Data is available, and
it is the last chunk of bytes.
Derived classes that do not know when the data
ends (for example, when returning the output of a
paged database query) may return `true` and an
empty vector.
*/
virtual std::pair<boost::tribool, std::vector<boost::asio::const_buffer>>
prepare(std::size_t bytes, std::function<void(void)> resume) = 0;
};
template <class Streambuf>
class StreambufWSMsg : public WSMsg
{
Streambuf sb_;
std::size_t n_ = 0;
public:
StreambufWSMsg(Streambuf&& sb) : sb_(std::move(sb))
{
}
std::pair<boost::tribool, std::vector<boost::asio::const_buffer>>
prepare(std::size_t bytes, std::function<void(void)>) override
{
if (sb_.size() == 0)
return {true, {}};
sb_.consume(n_);
boost::tribool done;
if (bytes < sb_.size())
{
n_ = bytes;
done = false;
}
else
{
n_ = sb_.size();
done = true;
}
auto const pb = boost::beast::buffers_prefix(n_, sb_.data());
std::vector<boost::asio::const_buffer> vb(
std::distance(pb.begin(), pb.end()));
std::copy(pb.begin(), pb.end(), std::back_inserter(vb));
return {done, vb};
}
};
struct WSSession
{
std::shared_ptr<void> appDefined;
virtual ~WSSession() = default;
WSSession() = default;
WSSession(WSSession const&) = delete;
WSSession&
operator=(WSSession const&) = delete;
virtual void
run() = 0;
virtual Port const&
port() const = 0;
virtual http_request_type const&
request() const = 0;
virtual boost::asio::ip::tcp::endpoint const&
remote_endpoint() const = 0;
/** Send a WebSockets message. */
virtual void
send(std::shared_ptr<WSMsg> w) = 0;
virtual void
close() = 0;
virtual void
close(boost::beast::websocket::close_reason const& reason) = 0;
/** Indicate that the response is complete.
The handler should call this when it has completed writing
the response.
*/
virtual void
complete() = 0;
};
} // namespace ripple
#endif