2#include <ossia/network/context.hpp>
3#include <ossia/network/sockets/udp_socket.hpp>
4#include <ossia/network/sockets/websocket_client.hpp>
6#include <ossia-qt/protocols/utils.hpp>
12#include <nano_observer.hpp>
18class qml_websocket_outbound_socket
20 ,
public Nano::Observer
21 ,
public protocols_sender
23 W_OBJECT(qml_websocket_outbound_socket)
25 qml_websocket_outbound_socket(
26 const ossia::net::outbound_socket_configuration& conf,
27 boost::asio::io_context& ctx)
28 : m_url{
"ws://" + conf.host +
":" + std::to_string(conf.port)}
29 , m_client{ctx, [this](auto&&... args) { on_message(args...); }}
31 if(onOpen.isCallable())
32 m_client.on_open.connect<&qml_websocket_outbound_socket::on_open>(
this);
33 if(onClose.isCallable())
34 m_client.on_close.connect<&qml_websocket_outbound_socket::on_close>(
this);
35 if(onError.isCallable())
36 m_client.on_fail.connect<&qml_websocket_outbound_socket::on_fail>(
this);
38 inline boost::asio::io_context& context() noexcept {
return m_client.context(); }
40 void open() { m_client.connect(m_url); }
42 void on_message(
auto hdl,
auto opcode,
const std::string& msg)
44 if(opcode == websocketpp::frame::opcode::text && onTextMessage.isCallable())
46 onTextMessage.call({QString::fromStdString(msg)});
48 else if(opcode == websocketpp::frame::opcode::binary && onBinaryMessage.isCallable())
51 {qjsEngine(
this)->toScriptValue(QByteArray(msg.data(), msg.size()))});
57 run_on_qt_thread({ onOpen.call({qjsEngine(
this)->newQObject(
this)}); });
61 run_on_qt_thread({ onError.call(); });
65 run_on_qt_thread({ onClose.call(); });
68 void write(QString message)
70 run_on_asio_thread({ m_client.send_message(message.toStdString()); });
74 void writeBinary(QByteArray buffer)
77 m_client.send_binary_message(std::string_view(buffer.data(), buffer.size()));
85 if(onClose.isCallable())
97 QJSValue onTextMessage;
98 QJSValue onBinaryMessage;
Low-level Websocket client.
Definition websocket_client.hpp:18
Definition qml_device.cpp:43