4 #include <boost/circular_buffer.hpp>
5 #include <boost/intrusive/list.hpp>
6 #include <nexus/quic/connection_id.hpp>
7 #include <nexus/quic/detail/stream_impl.hpp>
8 #include <nexus/udp.hpp>
12 namespace nexus::quic::detail {
14 struct accept_operation;
15 struct stream_accept_operation;
16 struct stream_connect_operation;
18 using stream_list = boost::intrusive::list<stream_impl>;
20 inline void list_erase(stream_impl& s, stream_list& from)
22 from.erase(from.iterator_to(s));
25 inline void list_transfer(stream_impl& s, stream_list& from, stream_list& to)
27 from.erase(from.iterator_to(s));
31 struct connection_context {
33 explicit connection_context(
bool incoming) noexcept : incoming(incoming) {}
36 struct incoming_connection : connection_context {
38 boost::circular_buffer<lsquic_stream*> incoming_streams;
40 incoming_connection(lsquic_conn* handle, uint32_t max_streams)
41 : connection_context(true),
43 incoming_streams(max_streams) {}
47 namespace connection_state {
52 accept_operation* op =
nullptr;
58 boost::circular_buffer<lsquic_stream*> incoming_streams;
59 stream_list connecting_streams;
60 stream_list accepting_streams;
61 stream_list open_streams;
62 stream_list closing_streams;
66 explicit open(lsquic_conn& handle) noexcept : handle(handle) {}
72 stream_list open_streams;
73 stream_list closing_streams;
77 explicit going_away(lsquic_conn& handle) noexcept : handle(handle) {}
90 using variant = std::variant<accepting, open, going_away, error, closed>;
93 enum class transition {
105 bool is_open(
const variant& state);
106 connection_id id(
const variant& state, error_code& ec);
107 udp::endpoint remote_endpoint(
const variant& state, error_code& ec);
110 void on_connect(variant& state, lsquic_conn* handle);
111 void on_handshake(variant& state,
int status);
112 void accept(variant& state, accept_operation& op);
113 void accept_incoming(variant& state, incoming_connection&& incoming);
114 void on_accept(variant& state, lsquic_conn* handle);
116 bool stream_connect(variant& state, stream_connect_operation& op);
117 stream_impl* on_stream_connect(variant& state, lsquic_stream* handle,
120 void stream_accept(variant& state, stream_accept_operation& op,
bool is_http);
121 stream_impl* on_stream_accept(variant& state, lsquic_stream* handle,
124 transition goaway(variant& state, error_code& ec);
125 transition on_remote_goaway(variant& state);
126 transition reset(variant& state, error_code ec);
127 transition close(variant& state, error_code& ec);
128 transition on_close(variant& state);
129 transition on_remote_close(variant& state, error_code ec);
130 void destroy(variant& state);
error
global error codes
Definition: error.hpp:11
@ going_away
sent GOAWAY to peer