3 #include <websocketpp/config/asio_client.hpp>
14 auto promise = std::make_shared<std::promise<std::vector<uint8_t>>>();
15 auto future = promise->get_future();
18 [promise = std::move(promise), subscriptionId](
const uint8_t* data,
size_t dataLength) {
22 const size_t offset = 1 + 4 + 8;
23 std::vector<uint8_t> dataCopy(dataLength - offset);
24 std::memcpy(dataCopy.data(), data + offset, dataLength - offset);
25 promise->set_value(std::move(dataCopy));
31 std::future<std::vector<Parameter>>
waitForParameters(std::shared_ptr<ClientInterface> client,
32 const std::string& requestId) {
33 auto promise = std::make_shared<std::promise<std::vector<Parameter>>>();
34 auto future = promise->get_future();
36 client->setTextMessageHandler(
37 [promise = std::move(promise), requestId](
const std::string& payload) {
38 const auto msg = nlohmann::json::parse(payload);
39 const auto& op = msg[
"op"].get<std::string>();
40 const auto id = msg.value(
"id",
"");
42 if (op ==
"parameterValues" && (requestId.empty() || requestId ==
id)) {
43 const auto parameters = msg[
"parameters"].get<std::vector<Parameter>>();
44 promise->set_value(std::move(parameters));
52 auto promise = std::make_shared<std::promise<ServiceResponse>>();
53 auto future = promise->get_future();
55 client->setBinaryMessageHandler(
56 [promise = std::move(promise)](
const uint8_t* data,
size_t dataLength)
mutable {
62 response.read(data + 1, dataLength - 1);
69 const std::string& serviceName) {
70 auto promise = std::make_shared<std::promise<Service>>();
71 auto future = promise->get_future();
73 client->setTextMessageHandler(
74 [promise = std::move(promise), serviceName](
const std::string& payload)
mutable {
75 const auto msg = nlohmann::json::parse(payload);
76 const auto& op = msg[
"op"].get<std::string>();
78 if (op ==
"advertiseServices") {
79 const auto services = msg[
"services"].get<std::vector<Service>>();
80 for (
const auto& service : services) {
81 if (service.name == serviceName) {
82 promise->set_value(service);
93 const std::string& topicName) {
94 auto promise = std::make_shared<std::promise<Channel>>();
95 auto future = promise->get_future();
97 client->setTextMessageHandler(
98 [promise = std::move(promise), topicName](
const std::string& payload)
mutable {
99 const auto msg = nlohmann::json::parse(payload);
100 const auto& op = msg[
"op"].get<std::string>();
102 if (op ==
"advertise") {
103 const auto channels = msg[
"channels"].get<std::vector<Channel>>();
104 for (
const auto& channel : channels) {
105 if (channel.topic == topicName) {
106 promise->set_value(channel);
116 auto promise = std::make_shared<std::promise<FetchAssetResponse>>();
117 auto future = promise->get_future();
119 client->setBinaryMessageHandler(
120 [promise = std::move(promise)](
const uint8_t* data,
size_t dataLength)
mutable {
131 const size_t errorMsgLength =
static_cast<size_t>(
ReadUint32LE(data + offset));
134 std::string(
reinterpret_cast<const char*
>(data + offset), errorMsgLength);
135 offset += errorMsgLength;
136 const auto payloadLength = dataLength - offset;
137 response.data.resize(payloadLength);
138 std::memcpy(
response.data.data(), data + offset, payloadLength);
145 template class Client<websocketpp::config::asio_client>;