#pragma once #include "message_broker.h" #include "connection_pool.h" #include #include #include #include #include #include #include #include #include struct WebSocketUserData { std::string userId; bool pongReceived = true; }; class WebSocketServer { public: WebSocketServer(int port, ConnectionPool &pool, MessageBroker &broker); void run(); void stop(); private: void startServer(); void processMessageQueue(); void pingClients(); void handleBrokerMessage(const std::string &message); void handleWebSocketMessage(uWS::WebSocket *ws, std::string_view message, uWS::OpCode opCode); void handleWebSocketClose(uWS::WebSocket *ws); std::string getUserIdFromFalukantUserId(int &userId); int port; ConnectionPool &pool; MessageBroker &broker; std::atomic running{false}; std::thread serverThread; std::thread messageProcessingThread; std::thread pingThread; std::unordered_map *> connections; std::shared_mutex connectionsMutex; std::queue messageQueue; std::mutex queueMutex; std::condition_variable queueCV; };