diff --git a/src/server/wsserver.cpp b/src/server/wsserver.cpp index 2ed64e2..b484819 100644 --- a/src/server/wsserver.cpp +++ b/src/server/wsserver.cpp @@ -8,66 +8,69 @@ sv::WSServer::WSServer(uint16_t port) { ws_thread_ = std::make_unique([this, port]() { crow::SimpleApp app; - app_ptr_ = (void*)&app; - - CROW_WEBSOCKET_ROUTE(app, "/ws") - .onopen([&](crow::websocket::connection& conn) { - CROW_LOG_INFO << "new websocket connection from " << conn.get_remote_ip(); - - std::lock_guard lock(mtx_); - conn.set_nodelay(); - - WSConnId conn_id = utils::AllocNum(id2conn_, last_id_); - - // register connection - id2conn_[conn_id] = &conn; - conn.userdata(reinterpret_cast(static_cast(conn_id))); - // push connection event - events_.emplace_back(WSE_CONNECTED, conn_id); - }) - .onclose([&](crow::websocket::connection& conn, const std::string& reason, uint16_t) { - CROW_LOG_INFO << "websocket connection closed: " << reason; - + { std::lock_guard lock(mtx_); - WSConnId conn_id = static_cast(reinterpret_cast(conn.userdata())); + app_ptr_ = (void*)&app; - // push disonnected event - events_.emplace_back(WSE_DISCONNECTED, conn_id); + CROW_WEBSOCKET_ROUTE(app, "/ws") + .onopen([&](crow::websocket::connection& conn) { + CROW_LOG_INFO << "new websocket connection from " << conn.get_remote_ip(); - id2conn_.erase(conn_id); - }) - .onmessage([&](crow::websocket::connection& conn, const std::string& data, bool is_binary) { - if (!is_binary) - return; // only accept binary messages here + std::lock_guard lock(mtx_); + conn.set_nodelay(); - std::lock_guard lock(mtx_); + WSConnId conn_id = utils::AllocNum(id2conn_, last_id_); - WSConnId conn_id = static_cast(reinterpret_cast(conn.userdata())); - events_.emplace_back(WSE_MESSAGE, conn_id, data); + // register connection + id2conn_[conn_id] = &conn; + conn.userdata(reinterpret_cast(static_cast(conn_id))); + // push connection event + events_.emplace_back(WSE_CONNECTED, conn_id); + }) + .onclose([&](crow::websocket::connection& conn, const std::string& reason, uint16_t) { + CROW_LOG_INFO << "websocket connection closed: " << reason; - }); + std::lock_guard lock(mtx_); - // CROW_ROUTE(app, "/") - // ([] { - // crow::mustache::context x; - // x["servername"] = "127.0.0.1"; - // auto page = crow::mustache::load("ws.html"); - // return page.render(x); - // }); + WSConnId conn_id = static_cast(reinterpret_cast(conn.userdata())); + + // push disonnected event + events_.emplace_back(WSE_DISCONNECTED, conn_id); + + id2conn_.erase(conn_id); + }) + .onmessage([&](crow::websocket::connection& conn, const std::string& data, bool is_binary) { + if (!is_binary) + return; // only accept binary messages here + + std::lock_guard lock(mtx_); + + WSConnId conn_id = static_cast(reinterpret_cast(conn.userdata())); + events_.emplace_back(WSE_MESSAGE, conn_id, data); + }); + + // CROW_ROUTE(app, "/") + // ([] { + // crow::mustache::context x; + // x["servername"] = "127.0.0.1"; + // auto page = crow::mustache::load("ws.html"); + // return page.render(x); + // }); + } app.port(port).run(); - - // push exit event - std::lock_guard lock(mtx_); - events_.emplace_back(WSE_EXIT); - - app_ptr_ = nullptr; + std::lock_guard lock(mtx_); + + // push exit event + events_.emplace_back(WSE_EXIT); + + app_ptr_ = nullptr; }); } -bool sv::WSServer::PollEvent(WSEvent &out_event) +bool sv::WSServer::PollEvent(WSEvent& out_event) { std::lock_guard lock(mtx_); @@ -82,16 +85,15 @@ bool sv::WSServer::PollEvent(WSEvent &out_event) void sv::WSServer::Send(WSConnId conn_id, std::string data) { std::lock_guard lock(mtx_); - + auto it = id2conn_.find(conn_id); if (it == id2conn_.end()) { - std::cerr << "attempted to send message to unknown conn ID " << conn_id <second).send_binary(std::move(data)); - } void sv::WSServer::Exit() @@ -103,6 +105,7 @@ void sv::WSServer::Exit() sv::WSServer::~WSServer() { + Exit(); if (ws_thread_ && ws_thread_->joinable()) ws_thread_->join(); } diff --git a/src/utils/files_server.cpp b/src/utils/files_server.cpp index 61bc523..3b6ebaf 100644 --- a/src/utils/files_server.cpp +++ b/src/utils/files_server.cpp @@ -1,10 +1,15 @@ #include "files.hpp" #include +#include std::string fs::ReadFileAsString(const std::string& path) { std::ifstream t(path, std::ios::binary); + + if (!t) + throw std::runtime_error(std::format("File not found: {}", path)); + t.seekg(0, std::ios::end); size_t size = t.tellg(); std::string buffer(size, ' ');