7#if !defined(ASYNC_MQTT_WS_FIXED_SIZE_ASYNC_READ_HPP)
8#define ASYNC_MQTT_WS_FIXED_SIZE_ASYNC_READ_HPP
13#include <boost/asio/buffer.hpp>
14#include <boost/asio/read.hpp>
15#include <boost/asio/compose.hpp>
16#include <boost/system/error_code.hpp>
17#include <boost/beast/websocket/stream.hpp>
21namespace as = boost::asio;
22namespace bs = boost::beast;
26template <
typename Stream,
typename MutableBufferSequence>
27struct async_read_impl {
29 MutableBufferSequence mb;
30 std::size_t received = 0;
31 as::executor_work_guard<typename Stream::executor_type> wg{stream.get_executor()};
33 template <
typename Self>
36 boost::system::error_code ec = boost::system::error_code{},
37 std::size_t bytes_transferred = 0
40 self.complete(ec, received);
43 received += bytes_transferred;
44 mb += bytes_transferred;
46 self.complete(ec, received);
49 auto a_mb{force_move(mb)};
50 auto exe = as::get_associated_executor(self);
51 stream.async_read_some(
68 typename MutableBufferSequence,
69 typename CompletionToken,
70 typename std::enable_if_t<
71 as::is_mutable_buffer_sequence<MutableBufferSequence>::value
76 bs::websocket::stream<NextLayer>& stream,
77 MutableBufferSequence
const& mb,
78 CompletionToken&& token
83 void(boost::system::error_code
const&, std::size_t)
85 detail::async_read_impl<bs::websocket::stream<NextLayer>, MutableBufferSequence>{
95 typename ConstBufferSequence,
96 typename CompletionToken,
97 typename std::enable_if_t<
98 as::is_const_buffer_sequence<ConstBufferSequence>::value
103 bs::websocket::stream<NextLayer>& stream,
104 ConstBufferSequence
const& cbs,
105 CompletionToken&& token
107 return stream.async_write(cbs, std::forward<CompletionToken>(token));