diff --git a/src/core/ssl_server.cpp b/src/core/ssl_server.cpp index c5a0258..395afc2 100644 --- a/src/core/ssl_server.cpp +++ b/src/core/ssl_server.cpp @@ -19,7 +19,7 @@ struct lws_protocols SSLServer::_protocols[] = { { "chat", SSLServer::wsCallback, - sizeof(WebSocketUserData), + 0, // No user data needed 4096 }, { nullptr, nullptr, 0, 0 } @@ -175,12 +175,7 @@ int SSLServer::wsCallback(struct lws *wsi, enum lws_callback_reasons reason, voi #ifdef YC_DEBUG std::cout << "[Debug] WebSocket connection established, requesting writable callback" << std::endl; #endif - // Initialize user data - if (ud) { - ud->token = ""; - ud->pendingMessage = ""; - } - // Request callback when writable to send initial message + // Don't use user data for now - just request writable callback lws_callback_on_writable(wsi); break; @@ -209,9 +204,7 @@ int SSLServer::wsCallback(struct lws *wsi, enum lws_callback_reasons reason, voi } case LWS_CALLBACK_CLOSED: - if (!ud->token.empty()) { - _instance->removeConnection(ud->token); - } + // Connection closed - no need to access user data break; default: @@ -250,11 +243,9 @@ void SSLServer::handleWebSocketMessage(struct lws *wsi, const std::string& messa // Send directly via WebSocket Json::StreamWriterBuilder builder; std::string jsonString = Json::writeString(builder, errorJson); - auto *ud = reinterpret_cast(lws_wsi_user(wsi)); - if (ud) { - ud->pendingMessage = jsonString; - lws_callback_on_writable(wsi); - } + unsigned char buf[LWS_PRE + jsonString.length()]; + memcpy(buf + LWS_PRE, jsonString.c_str(), jsonString.length()); + lws_write(wsi, buf + LWS_PRE, jsonString.length(), LWS_WRITE_TEXT); return; } @@ -266,11 +257,9 @@ void SSLServer::handleWebSocketMessage(struct lws *wsi, const std::string& messa // Send directly via WebSocket Json::StreamWriterBuilder builder; std::string jsonString = Json::writeString(builder, errorJson); - auto *ud = reinterpret_cast(lws_wsi_user(wsi)); - if (ud) { - ud->pendingMessage = jsonString; - lws_callback_on_writable(wsi); - } + unsigned char buf[LWS_PRE + jsonString.length()]; + memcpy(buf + LWS_PRE, jsonString.c_str(), jsonString.length()); + lws_write(wsi, buf + LWS_PRE, jsonString.length(), LWS_WRITE_TEXT); return; } @@ -279,13 +268,7 @@ void SSLServer::handleWebSocketMessage(struct lws *wsi, const std::string& messa token = Base::generateToken(); } - // Store user data - auto *ud = reinterpret_cast(lws_wsi_user(wsi)); - ud->token = token; - ud->userName = name; - ud->userColor = color; - ud->currentRoom = room; - ud->authenticated = true; + // Store user data in connections map instead #ifdef YC_DEBUG std::cout << "[Debug] WebSocket user data stored - token: " << token << ", name: " << name << ", room: " << room << std::endl; @@ -347,15 +330,11 @@ void SSLServer::handleWebSocketMessage(struct lws *wsi, const std::string& messa // Send directly via WebSocket Json::StreamWriterBuilder builder; std::string jsonString = Json::writeString(builder, errorJson); - auto *ud = reinterpret_cast(lws_wsi_user(wsi)); - if (ud) { - ud->pendingMessage = jsonString; - lws_callback_on_writable(wsi); - } + unsigned char buf[LWS_PRE + jsonString.length()]; + memcpy(buf + LWS_PRE, jsonString.c_str(), jsonString.length()); + lws_write(wsi, buf + LWS_PRE, jsonString.length(), LWS_WRITE_TEXT); } else { // Send both responses - client expects both "init_success" and "room_entered" - auto *ud = reinterpret_cast(lws_wsi_user(wsi)); - if (ud) { Json::StreamWriterBuilder builder; // First send init_success @@ -364,8 +343,9 @@ void SSLServer::handleWebSocketMessage(struct lws *wsi, const std::string& messa initSuccessJson["token"] = token; initSuccessJson["message"] = "Erfolgreich verbunden"; std::string initSuccessString = Json::writeString(builder, initSuccessJson); - ud->pendingMessage = initSuccessString; - lws_callback_on_writable(wsi); + unsigned char buf[LWS_PRE + initSuccessString.length()]; + memcpy(buf + LWS_PRE, initSuccessString.c_str(), initSuccessString.length()); + lws_write(wsi, buf + LWS_PRE, initSuccessString.length(), LWS_WRITE_TEXT); // Add room_entered to message queue for later sending Json::Value roomEnteredJson; @@ -382,7 +362,6 @@ void SSLServer::handleWebSocketMessage(struct lws *wsi, const std::string& messa _messageQueue.push(roomEnteredString); } _queueCV.notify_one(); - } } } else if (type == "message") { // Handle chat message @@ -437,11 +416,10 @@ void SSLServer::sendMessage(int socket, const std::string& message) { std::shared_lock lock(_connectionsMutex); for (auto& pair : _connections) { if (lws_get_socket_fd(pair.second) == socket) { - auto *ud = reinterpret_cast(lws_wsi_user(pair.second)); - if (ud) { - ud->pendingMessage = message; - lws_callback_on_writable(pair.second); - } + // Send message directly + unsigned char buf[LWS_PRE + message.length()]; + memcpy(buf + LWS_PRE, message.c_str(), message.length()); + lws_write(pair.second, buf + LWS_PRE, message.length(), LWS_WRITE_TEXT); break; } } diff --git a/src/lib/base.cpp b/src/lib/base.cpp index a46bb2a..151e86e 100755 --- a/src/lib/base.cpp +++ b/src/lib/base.cpp @@ -17,14 +17,7 @@ #include // Forward declaration for WebSocket user data -struct WebSocketUserData { - std::string pendingMessage; - std::string token; - std::string userName; - std::string userColor; - std::string currentRoom; - bool authenticated; -}; +// WebSocketUserData removed - using direct lws_write instead namespace Yc { namespace Lib {