#pragma once #include "Plot.hpp" #include #include #include #include #include namespace aethera::web { class Graph_WebSocket final : public std::enable_shared_from_this { public: Graph_WebSocket(drogon::WebSocketConnectionPtr connection, std::shared_ptr plot, std::string page_id); ~Graph_WebSocket(); Graph_WebSocket(const Graph_WebSocket&) = delete; Graph_WebSocket& operator=(const Graph_WebSocket&) = delete; void start(); void receive(std::string_view message); void close() noexcept; private: void deliver_frame(std::shared_ptr frame); struct Private; std::unique_ptr d; }; class Graph_WebSocket_Controller final : public drogon::WebSocketController { public: using Plot_Resolver = std::function(std::string_view)>; explicit Graph_WebSocket_Controller(Plot_Resolver resolver); void handleNewMessage(const drogon::WebSocketConnectionPtr& connection, std::string&& message, const drogon::WebSocketMessageType& type) override; void handleNewConnection(const drogon::HttpRequestPtr& request, const drogon::WebSocketConnectionPtr& connection) override; void handleConnectionClosed(const drogon::WebSocketConnectionPtr& connection) override; static void initPathRouting(); private: Plot_Resolver resolve_plot; }; }