test_client.cpp
Go to the documentation of this file.
1 #include <chrono>
2 
3 #include <websocketpp/config/asio_client.hpp>
4 
8 
9 namespace foxglove {
10 
11 std::future<std::vector<uint8_t>> waitForChannelMsg(ClientInterface* client,
12  SubscriptionId subscriptionId) {
13  // Set up binary message handler to resolve when a binary message has been received
14  auto promise = std::make_shared<std::promise<std::vector<uint8_t>>>();
15  auto future = promise->get_future();
16 
18  [promise = std::move(promise), subscriptionId](const uint8_t* data, size_t dataLength) {
19  if (ReadUint32LE(data + 1) != subscriptionId) {
20  return;
21  }
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));
26  });
27 
28  return future;
29 }
30 
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();
35 
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", "");
41 
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));
45  }
46  });
47 
48  return future;
49 }
50 
51 std::future<ServiceResponse> waitForServiceResponse(std::shared_ptr<ClientInterface> client) {
52  auto promise = std::make_shared<std::promise<ServiceResponse>>();
53  auto future = promise->get_future();
54 
55  client->setBinaryMessageHandler(
56  [promise = std::move(promise)](const uint8_t* data, size_t dataLength) mutable {
57  if (static_cast<BinaryOpcode>(data[0]) != BinaryOpcode::SERVICE_CALL_RESPONSE) {
58  return;
59  }
60 
62  response.read(data + 1, dataLength - 1);
63  promise->set_value(response);
64  });
65  return future;
66 }
67 
68 std::future<Service> waitForService(std::shared_ptr<ClientInterface> client,
69  const std::string& serviceName) {
70  auto promise = std::make_shared<std::promise<Service>>();
71  auto future = promise->get_future();
72 
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>();
77 
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);
83  break;
84  }
85  }
86  }
87  });
88 
89  return future;
90 }
91 
92 std::future<Channel> waitForChannel(std::shared_ptr<ClientInterface> client,
93  const std::string& topicName) {
94  auto promise = std::make_shared<std::promise<Channel>>();
95  auto future = promise->get_future();
96 
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>();
101 
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);
107  break;
108  }
109  }
110  }
111  });
112  return future;
113 }
114 
115 std::future<FetchAssetResponse> waitForFetchAssetResponse(std::shared_ptr<ClientInterface> client) {
116  auto promise = std::make_shared<std::promise<FetchAssetResponse>>();
117  auto future = promise->get_future();
118 
119  client->setBinaryMessageHandler(
120  [promise = std::move(promise)](const uint8_t* data, size_t dataLength) mutable {
121  if (static_cast<BinaryOpcode>(data[0]) != BinaryOpcode::FETCH_ASSET_RESPONSE) {
122  return;
123  }
124 
126  size_t offset = 1;
127  response.requestId = ReadUint32LE(data + offset);
128  offset += 4;
129  response.status = static_cast<foxglove::FetchAssetStatus>(data[offset]);
130  offset += 1;
131  const size_t errorMsgLength = static_cast<size_t>(ReadUint32LE(data + offset));
132  offset += 4;
133  response.errorMessage =
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);
139  promise->set_value(response);
140  });
141  return future;
142 }
143 
144 // Explicit template instantiation
145 template class Client<websocketpp::config::asio_client>;
146 
147 } // namespace foxglove
response
const std::string response
foxglove::BinaryOpcode::FETCH_ASSET_RESPONSE
@ FETCH_ASSET_RESPONSE
foxglove
Definition: base64.hpp:8
foxglove::ClientInterface::setBinaryMessageHandler
virtual void setBinaryMessageHandler(BinaryMessageHandler handler)=0
foxglove::ReadUint32LE
uint32_t ReadUint32LE(const uint8_t *buf)
Definition: serialization.hpp:38
foxglove::ServiceResponse
Definition: common.hpp:130
foxglove::BinaryOpcode::SERVICE_CALL_RESPONSE
@ SERVICE_CALL_RESPONSE
foxglove::FetchAssetResponse
Definition: common.hpp:155
foxglove::waitForServiceResponse
std::future< ServiceResponse > waitForServiceResponse(std::shared_ptr< ClientInterface > client)
Definition: test_client.cpp:51
serialization.hpp
foxglove::waitForChannelMsg
std::future< std::vector< uint8_t > > waitForChannelMsg(ClientInterface *client, SubscriptionId subscriptionId)
Definition: test_client.cpp:11
foxglove::ClientInterface
Definition: websocket_client.hpp:32
foxglove::waitForService
std::future< Service > waitForService(std::shared_ptr< ClientInterface > client, const std::string &serviceName)
Definition: test_client.cpp:68
foxglove::waitForFetchAssetResponse
std::future< FetchAssetResponse > waitForFetchAssetResponse(std::shared_ptr< ClientInterface > client)
Definition: test_client.cpp:115
foxglove::SubscriptionId
uint32_t SubscriptionId
Definition: common.hpp:28
foxglove::waitForParameters
std::future< std::vector< Parameter > > waitForParameters(std::shared_ptr< ClientInterface > client, const std::string &requestId=std::string())
Definition: test_client.cpp:31
foxglove::waitForChannel
std::future< Channel > waitForChannel(std::shared_ptr< ClientInterface > client, const std::string &topicName)
Definition: test_client.cpp:92
websocket_client.hpp
foxglove::BinaryOpcode
BinaryOpcode
Definition: common.hpp:31
test_client.hpp
foxglove::FetchAssetStatus
FetchAssetStatus
Definition: common.hpp:150


foxglove_bridge
Author(s): Foxglove
autogenerated on Tue May 20 2025 02:34:26