#pragma once #include #include #include #include #include #include #include "Protocol.hpp" #include "Database.hpp" #include "SessionManager.hpp" struct ClientConnection { int fd; SSL* ssl; uint64_t session_id; std::string username; }; struct ShardInfo { std::string shard_id; int max_capacity; int current_load; }; class Server { public: Server(const std::string& config_file); ~Server(); void run(); void stop(); private: void initTLS(); void setupListener(int port); void epollLoop(); void handleClientEvent(int fd); void readPacket(ClientConnection* conn); void processPacket(ClientConnection* conn, const PacketHeader& header, const std::vector& payload); void sendPacket(ClientConnection* conn, uint16_t opcode, uint64_t request_id, uint64_t session_id, const std::vector& payload); ShardInfo selectShard(); std::string generateSalt(size_t length = 16); std::string hashArgon2(const std::string& input, const std::string& salt); int listen_fd_; SSL_CTX* ssl_ctx_; bool running_; int epoll_fd_; Database db_; SessionManager sessionManager_; std::mutex conn_mutex_; std::unordered_map clients_; std::vector shards_; };