From 01a2b4844c510c04a498fe5afe2291bc3f4fbdc3 Mon Sep 17 00:00:00 2001 From: Shashwat Agrawal Date: Wed, 29 Apr 2026 00:30:19 +0530 Subject: [PATCH 1/3] refactor(backend): no exceptions Signed-off-by: Shashwat Agrawal --- backend/external/uwebsockets | 2 +- backend/src/WebSocketServer.cpp | 67 +++++++++++++++++---------------- backend/src/main.cpp | 13 ++----- 3 files changed, 39 insertions(+), 43 deletions(-) diff --git a/backend/external/uwebsockets b/backend/external/uwebsockets index 65f0af8..6b7f354 160000 --- a/backend/external/uwebsockets +++ b/backend/external/uwebsockets @@ -1 +1 @@ -Subproject commit 65f0af84fd0a43d8fb71574ae89f4155bd15be8b +Subproject commit 6b7f3540cec801a7f1cb01141eae8ab989dd4e70 diff --git a/backend/src/WebSocketServer.cpp b/backend/src/WebSocketServer.cpp index e3ba36e..ad4908e 100644 --- a/backend/src/WebSocketServer.cpp +++ b/backend/src/WebSocketServer.cpp @@ -1,5 +1,6 @@ #include "include/WebSocketServer.hpp" #include "include/MarketData.hpp" +#include #include #include #include @@ -108,20 +109,22 @@ void WebSocketServer::on_message(WebSocket *ws, std::string_view message, SocketData *user = ws->getUserData(); if (!message.empty() && std::all_of(message.begin(), message.end(), ::isdigit)) { - try { - auto server_timestamp = - std::chrono::duration_cast( - std::chrono::system_clock::now().time_since_epoch()) - .count(); - long long client_timestamp = std::stoll(std::string(message)); - long long diff = server_timestamp - client_timestamp; - std::println("[LOG]: server: {} client: {} diff: {}", - server_timestamp, client_timestamp, diff); - - } catch (const std::exception &e) { - std::println(stderr, "Recieved a non-timestamp message: {} ", + long long client_timestamp{}; + // https://en.cppreference.com/cpp/utility/from_chars + auto [ptr, ec] = std::from_chars( + message.data(), message.data() + message.size(), client_timestamp); + if (ec != std::errc{}) { + std::println(stderr, "Received a non-timestamp message: {}", message); + return; } + auto server_timestamp = + std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()) + .count(); + long long diff = server_timestamp - client_timestamp; + std::println("[LOG]: server: {} client: {} diff: {}", server_timestamp, + client_timestamp, diff); return; } @@ -136,21 +139,26 @@ void WebSocketServer::on_message(WebSocket *ws, std::string_view message, return MessageType::UNKNOWN; }; - try { - json msg = json::parse(message); - std::string type = msg.value("type", ""); - MessageType mtype = message_type_from_string(type); - if (mtype != MessageType::LOGIN && !user->is_authenticated) { - ws->send(R"({"type":"error","message":"not_authenticated"})", - uWS::OpCode::TEXT); - return; - } + json msg = json::parse(message, nullptr, false); + if (msg.is_discarded()) { + std::println("[Error] Invalid JSON:"); + ws->send(R"({"type":"error","message":"invalid_json"})", + uWS::OpCode::TEXT); + return; + } + std::string type = msg.value("type", ""); + MessageType mtype = message_type_from_string(type); + if (mtype != MessageType::LOGIN && !user->is_authenticated) { + ws->send(R"({"type":"error","message":"not_authenticated"})", + uWS::OpCode::TEXT); + return; + } - /* - * TODO: class with virtual handler function would be the best choice - * for this :)" - */ - // clang-format off + /* + * TODO: class with virtual handler function would be the best choice + * for this :)" + */ + // clang-format off switch (mtype) { case MessageType::LOGIN: { LoginHandler(this, ws, user, msg); @@ -171,12 +179,7 @@ void WebSocketServer::on_message(WebSocket *ws, std::string_view message, break; } } - // clang-format on - } catch (const std::exception &e) { - std::println("[Error] Invalid JSON:{}", e.what()); - ws->send(R"({"type":"error","message":"invalid_json"})", - uWS::OpCode::TEXT); - } + // clang-format on } void WebSocketServer::on_close(WebSocket * /*ws*/, int /*code*/, diff --git a/backend/src/main.cpp b/backend/src/main.cpp index a1888e5..269193c 100644 --- a/backend/src/main.cpp +++ b/backend/src/main.cpp @@ -3,15 +3,8 @@ int main() { constexpr int listen_port = 7000; - try { - WebSocketServer server(listen_port, "../certs/key.pem", - "../certs/cert.pem"); - server.run(); - } catch (const std::exception &e) { - std::cerr << "An unhandled exception occurred: " << e.what() - << std::endl; - return 1; - } - + WebSocketServer server(listen_port, "../certs/key.pem", + "../certs/cert.pem"); + server.run(); return 0; } From 333b7c5ab3389801b1ca55ce697478bd6834ffdd Mon Sep 17 00:00:00 2001 From: Shashwat Agrawal Date: Thu, 30 Apr 2026 00:34:38 +0530 Subject: [PATCH 2/3] chore(build): adding -fno-exceptions to CMakeLists.txt Signed-off-by: Shashwat Agrawal --- backend/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/CMakeLists.txt b/backend/CMakeLists.txt index 17b83d1..e1faa81 100644 --- a/backend/CMakeLists.txt +++ b/backend/CMakeLists.txt @@ -13,7 +13,7 @@ set(TARGET_NAME websocket_server) if (MSVC) add_compile_options(/W4 /WX) else() - add_compile_options(-Wall -Wextra -Wpedantic) + add_compile_options(-Wall -Wextra -Wpedantic -fno-exceptions) if (CMAKE_BUILD_TYPE MATCHES "Debug|RelWithDebInfo") add_compile_options( -fsanitize=address,undefined From 42fbdb53b3b21e25645f811453014bd87ac5a55c Mon Sep 17 00:00:00 2001 From: Shashwat Agrawal Date: Thu, 30 Apr 2026 15:31:54 +0530 Subject: [PATCH 3/3] comp: support for test user login Signed-off-by: Shashwat Agrawal --- backend/src/AuthManager.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/src/AuthManager.cpp b/backend/src/AuthManager.cpp index 3f7056b..7504e88 100644 --- a/backend/src/AuthManager.cpp +++ b/backend/src/AuthManager.cpp @@ -4,7 +4,8 @@ AuthManager::AuthManager() { credentials_ = { {"shashwat", "shashwat"}, - {"nero", "nero"} + {"nero", "nero"}, + {"test", "test"} }; }; // clang-format on