11#include " Connection.hpp"
22#include " Exceptions.hpp"
3+ #include < iostream>
34
45namespace xapi
56{
@@ -25,7 +26,19 @@ Connection::Connection(Connection &&other) noexcept
2526
2627Connection::~Connection ()
2728{
28- cancelAsyncOperations ();
29+ m_cancellationSignal.emit (boost::asio::cancellation_type::all);
30+ if (m_websocket.is_open ())
31+ {
32+ try
33+ {
34+ // Attempt a graceful WebSocket closure
35+ m_websocket.close (boost::beast::websocket::close_code::normal);
36+ }
37+ catch (const boost::system::system_error &e)
38+ {
39+ std::cerr << " Fatal error: " << e.what () << std::endl;
40+ }
41+ }
2942}
3043
3144boost::asio::awaitable<void > Connection::connect (const boost::url &url)
@@ -79,7 +92,7 @@ boost::asio::awaitable<void> Connection::establishSSLConnection(
7992
8093boost::asio::awaitable<void > Connection::disconnect ()
8194{
82- cancelAsyncOperations ( );
95+ m_cancellationSignal. emit (boost::asio::cancellation_type::all );
8396 try
8497 {
8598 co_await m_websocket.async_close (boost::beast::websocket::close_code::normal, boost::asio::use_awaitable);
@@ -148,15 +161,17 @@ boost::asio::awaitable<void> Connection::startKeepAlive(boost::asio::cancellatio
148161 const auto executor = co_await boost::asio::this_coro::executor;
149162 boost::asio::steady_timer pingTimer (executor);
150163 const auto pingInterval = std::chrono::seconds (20 );
164+ bool canceled = true ;
151165
152- cancellationSlot.assign ([&]([[maybe_unused]] boost::asio::cancellation_type type) {
166+ cancellationSlot.assign ([&](boost::asio::cancellation_type type) {
153167 if (type == boost::asio::cancellation_type::all)
154168 {
169+ canceled = true ;
155170 pingTimer.cancel ();
156171 }
157172 });
158173
159- while (true )
174+ while (!canceled )
160175 {
161176 try
162177 {
@@ -179,14 +194,5 @@ boost::asio::awaitable<void> Connection::startKeepAlive(boost::asio::cancellatio
179194 }
180195}
181196
182- void Connection::cancelAsyncOperations () noexcept
183- {
184- m_cancellationSignal.emit (boost::asio::cancellation_type::all);
185- if (m_websocket.is_open ())
186- {
187- m_websocket.next_layer ().next_layer ().cancel ();
188- }
189- }
190-
191197} // namespace internals
192198} // namespace xapi
0 commit comments