uvco 0.1
Loading...
Searching...
No Matches
stream_server_base.h
Go to the documentation of this file.
1// uvco (c) 2024 Lewin Bormann. See LICENSE for specific terms.
2
3#pragma once
4
5#include <fmt/core.h>
6#include <uv.h>
7
11
12#include <coroutine>
13#include <memory>
14#include <optional>
15#include <variant>
16#include <vector>
17
18namespace uvco {
19
22
26template <typename UvStreamType> struct UvStreamInitHelper {
27 static void init(uv_loop_t * /*loop*/, UvStreamType * /*stream*/) {
28 BOOST_ASSERT_MSG(false, "UvStreamInit not specialized for this type");
29 }
30};
31
38template <typename UvStreamType, typename StreamType> class StreamServerBase {
39public:
45
51 MultiPromise<StreamType> listen(int backlog = 128);
52
55
56protected:
57 explicit StreamServerBase(std::unique_ptr<UvStreamType> socket)
58 : socket_{std::move(socket)} {}
59 std::unique_ptr<UvStreamType> socket_;
60
61private:
62 static void onNewConnection(uv_stream_t *stream, uv_status status);
63
65 explicit ConnectionAwaiter_(UvStreamType &socket) : socket_{socket} {
66 accepted_.reserve(4);
67 }
68 [[nodiscard]] bool await_ready() const;
69 bool await_suspend(std::coroutine_handle<> handle);
70 // Returns true if one or more connections were accepted.
71 // Returns false if the listener should stop.
72 [[nodiscard]] bool await_resume() const { return !stopped_; }
73
75 void stop();
76
77 UvStreamType &socket_;
78 std::optional<std::coroutine_handle<>> handle_;
79
80 // Set of accepted connections or errors.
81 using Accepted = std::variant<uv_status, StreamType>;
82 std::vector<Accepted> accepted_;
83
84 bool stopped_ = false;
85 };
86};
87
88// Implementation contained in stream_server_base_impl.cc, where it's
89// instantiated for the currently two socket types using it (UnixServer and
90// TcpServer). Include stream_server_base_impl.h to obtain declarations for
91// those specializations.
92
94
95} // namespace uvco
Definition multipromise.h:133
Definition promise.h:76
Definition stream_server_base.h:38
StreamServerBase(StreamServerBase &&)=default
StreamServerBase & operator=(StreamServerBase &&)=default
std::unique_ptr< UvStreamType > socket_
Definition stream_server_base.h:59
MultiPromise< StreamType > listen(int backlog=128)
Definition stream_server_base_impl.cc:61
Promise< void > close()
Close server and stop accepting client connections; must be awaited.
Definition stream_server_base_impl.cc:43
StreamServerBase(const StreamServerBase &)=delete
StreamServerBase(std::unique_ptr< UvStreamType > socket)
Definition stream_server_base.h:57
StreamServerBase & operator=(const StreamServerBase &)=delete
static void onNewConnection(uv_stream_t *stream, uv_status status)
Definition stream_server_base_impl.cc:145
~StreamServerBase()
Definition stream_server_base_impl.cc:31
int uv_status
Result of a libuv operation, an errno error code.
Definition internal_utils.h:22
Definition async_work.cc:17
Definition stream_server_base.h:64
std::variant< uv_status, StreamType > Accepted
Definition stream_server_base.h:81
bool await_ready() const
Definition stream_server_base_impl.cc:140
bool await_resume() const
Definition stream_server_base.h:72
bool await_suspend(std::coroutine_handle<> handle)
Definition stream_server_base_impl.cc:132
void stop()
Stop a listener coroutine.
Definition stream_server_base_impl.cc:116
std::vector< Accepted > accepted_
Definition stream_server_base.h:82
bool stopped_
Definition stream_server_base.h:84
std::optional< std::coroutine_handle<> > handle_
Definition stream_server_base.h:78
UvStreamType & socket_
Definition stream_server_base.h:77
ConnectionAwaiter_(UvStreamType &socket)
Definition stream_server_base.h:65
Definition stream_server_base.h:26
static void init(uv_loop_t *, UvStreamType *)
Definition stream_server_base.h:27