7#include <boost/asio.hpp>
8#if defined(BOOST_ASIO_HAS_CO_AWAIT)
9#include <boost/asio/experimental/awaitable_operators.hpp>
11#include "common/common.hpp"
13namespace net = boost::asio;
14namespace resp3 = aedis::resp3;
15using namespace net::experimental::awaitable_operators;
16using tcp_socket = net::use_awaitable_t<>::as_default_on_t<net::ip::tcp::socket>;
17using tcp_acceptor = net::use_awaitable_t<>::as_default_on_t<net::ip::tcp::acceptor>;
18using signal_set = net::use_awaitable_t<>::as_default_on_t<net::signal_set>;
21auto echo_server_session(tcp_socket socket, std::shared_ptr<connection> conn) -> net::awaitable<void>
26 for (std::string buffer;;) {
27 auto n =
co_await net::async_read_until(socket, net::dynamic_buffer(buffer, 1024),
"\n");
28 req.
push(
"PING", buffer);
29 auto tmp = std::tie(resp);
30 co_await conn->async_exec(req,
adapt(tmp));
39auto listener(std::shared_ptr<connection> conn) -> net::awaitable<void>
41 auto ex =
co_await net::this_coro::executor;
42 tcp_acceptor acc(ex, {net::ip::tcp::v4(), 55555});
44 net::co_spawn(ex, echo_server_session(
co_await acc.async_accept(), conn), net::detached);
48auto co_main(std::string host, std::string port) -> net::awaitable<void>
50 auto ex =
co_await net::this_coro::executor;
51 auto conn = std::make_shared<connection>(ex);
52 signal_set sig{ex, SIGINT, SIGTERM};
57 co_await connect(conn, host, port);
58 co_await ((conn->async_run() || listener(conn) || healthy_checker(conn) ||
59 sig.async_wait()) && conn->async_exec(req));
void push(std::string_view cmd, Ts const &... args)
Appends a new command to the end of the request.
void clear()
Clears the request preserving allocated memory.
auto adapt(std::size_t max_read_size=(std::numeric_limits< std::size_t >::max)()) noexcept
Creates an adapter that ignores responses.
auto async_write(AsyncWriteStream &stream, Request const &req, CompletionToken &&token=boost::asio::default_completion_token_t< typename AsyncWriteStream::executor_type >{})
Writes a request asynchronously.