← source index

src/WebSocket.h

52 lines  ·  1.6 K  ·  cpp
#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;
};