#ifndef YC_LIB_SSL_SERVER_H #define YC_LIB_SSL_SERVER_H #include #include #include #include #include #include #include #include #include #include #include namespace Yc { namespace Lib { class Config; class Database; class ChatRoom; class ChatUser; struct WebSocketUserData { std::string token; std::string userName; std::string userColor; std::string currentRoom; bool authenticated = false; std::string pendingMessage; }; class SSLServer { public: SSLServer(std::shared_ptr config, std::shared_ptr database); ~SSLServer(); void run(); void stop(); void createRooms(); // Room management std::vector roomList(); bool roomAllowed(const std::string& roomName, const std::string& userName, const std::string& password); bool changeRoom(std::shared_ptr user, const std::string& newRoom, const std::string& password); // User management bool userExists(const std::string& userName); void initUser(const std::string& token, const std::string& name, const std::string& room, const std::string& color, const std::string& password); // Message handling void sendMessage(int socket, const std::string& message); void broadcastToRoom(const std::string& roomName, const std::string& message); // WebSocket callbacks static int wsCallback(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len); private: void startServer(); void processMessageQueue(); void handleWebSocketMessage(struct lws *wsi, const std::string& message); void addConnection(const std::string& token, struct lws *wsi); void removeConnection(const std::string& token); std::shared_ptr getUserByToken(const std::string& token); std::shared_ptr _config; std::shared_ptr _database; std::vector> _rooms; // SSL/TLS settings bool _useSSL; std::string _certPath; std::string _keyPath; int _port; // Server state std::atomic _running{false}; struct lws_context* _context = nullptr; std::thread _serverThread; std::thread _messageThread; // Message queue std::mutex _queueMutex; std::condition_variable _queueCV; std::queue _messageQueue; // Connections std::shared_mutex _connectionsMutex; std::unordered_map _connections; std::unordered_map> _users; // Static instance for callbacks static SSLServer* _instance; static struct lws_protocols _protocols[]; }; } // namespace Lib } // namespace Yc #endif // YC_LIB_SSL_SERVER_H