#pragma once #include "Address.hpp" #include "NetworkError.hpp" #include "protocol/quicr/QuicrConnection.hpp" #include #include #include #include namespace tw::net::quicr { class QuicrConnection; class QuicrConnectionListener; class QuicrEndpoint { int32_t m_socket_fd; std::unordered_map> m_connections; std::vector m_inbound_buffer; QuicrConnectionListener* m_new_connection_handler; void process_datagram(std::span datagram, Address from); QuicrEndpoint(int socket_fd); public: QuicrEndpoint(const QuicrEndpoint&) = delete; QuicrEndpoint& operator=(const QuicrEndpoint&) = delete; QuicrEndpoint(QuicrEndpoint&&) = delete; QuicrEndpoint& operator=(QuicrEndpoint&&) = delete; ~QuicrEndpoint() { ::close(m_socket_fd); m_socket_fd = -1; } std::vector>> clients() const { std::vector>> result; for (const auto& [id, connection] : m_connections) { result.emplace_back(id, connection); } return result; } static tl::expected, NetworkError> create(); /** * Creates the QUICr endpoint and binds it to a port. */ static tl::expected, NetworkError> create_and_bind(int16_t port); void assign_listener(QuicrConnectionListener* listener) { m_new_connection_handler = listener; } tl::expected bind(int port); tl::expected connect(Address address); tl::expected send_to(std::span data, Address to); tl::expected read_from_into(std::span data, Address* out_from); void poll(); }; }