#include "../Include.h"
#include <boost/beast/core.hpp>
#include <boost/beast/websocket.hpp>
#include <boost/beast/websocket/ssl.hpp>
#include <boost/asio/connect.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/ssl.hpp>
class WebSocket
{
public:
WebSocket(int capacity = 10);
std::pair<int, std::string> send(int, const std::string&);
std::pair<int, std::string> recv(int);
std::pair<int, std::string> connect(const std::string&, const std::string&, const std::string&, const std::string&, int id = 0);
std::pair<int, std::string> reconnect(int);
std::pair<int, std::string> close(int);
std::pair<int, std::string> getSymKey(int);
~WebSocket();
public:
struct ConnectionDetails
{
std::string host = "";
std::string port = "";
std::string target = "";
std::string instruments = "";
};
struct WebSocketData
{
std::string symKey = "";
std::unique_ptr<boost::asio::ssl::context> sslCtx;
std::unique_ptr<boost::asio::ip::tcp::resolver> res;
std::unique_ptr<boost::beast::websocket::stream<boost::asio::ip::tcp::socket>> socket;
std::unique_ptr<boost::beast::websocket::stream<boost::asio::ssl::stream<boost::asio::ip::tcp::socket>>> sslSocket;
};
private:
uint8_t mSize;
uint8_t mCapacity;
std::unordered_map<int, std::shared_ptr<WebSocketData>> mConnCache;
std::unordered_map<int, ConnectionDetails> mConnDetails;
std::unordered_map<std::string, int> mConnLookup;
boost::asio::io_context mCtx;
boost::beast::flat_buffer mBuffer;
};