/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* Connection.hpp :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: acossari +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/08/28 09:21:04 by acossari #+# #+# */ /* Updated: 2026/08/29 18:07:36 by acossari ### ########.fr */ /* */ /* ************************************************************************** */ #pragma once #include #include #include "net/ByteBuffer.hpp" #include "net/FileDescriptor.hpp" namespace webserv { class Connection final { public: enum class Lifecycle { Alive, Done, Fatal }; struct Outcome { Lifecycle lifecycle; std::uint32_t desiredEvents; }; static constexpr std::size_t LOW_WATERMARK = 16uz * 1024; explicit Connection(FileDescriptor socket); Connection(const Connection&) = delete; Connection& operator=(const Connection&) = delete; Connection(Connection&&) = delete; Connection& operator=(Connection&&) = delete; int fd() const noexcept { return socket_.get(); } Outcome onClientEvent(std::uint32_t events); std::uint32_t desiredEvents() noexcept; void close() noexcept { socket_.reset(); } private: bool receive(); bool transmit(); void forwardReceivedBytes(); FileDescriptor socket_; ByteBuffer receiveBuffer_; ByteBuffer sendBuffer_; bool readClosed_ = false; }; } // namespace webserv