Socket connect no longer synchronous and blocking

Summary:
Never really liked this code. Before this change, calls to connect were blocking.

Because of this, we had to make use of promises and a bit of really not that good-looking code.

So, this change makes connect non-blocking meaning that we make full use of our event handler.

These changes contain:
- CSR is not getting generated after each failed attempt.
- Connect is no longer blocking.
- Do not report events via the handler when explicitly disconnecting.

Reviewed By: jknoxville

Differential Revision: D46853228

fbshipit-source-id: 00e6a9c7c039a756175fe14982959e078d92bacb
This commit is contained in:
Lorenzo Blasa
2023-06-28 12:09:58 -07:00
committed by Facebook GitHub Bot
parent 65e515bdaa
commit e42db220ee
22 changed files with 286 additions and 436 deletions

View File

@@ -62,9 +62,9 @@ WebSocketClient::~WebSocketClient() {
disconnect();
}
bool WebSocketClient::connect(FlipperConnectionManager* manager) {
void WebSocketClient::connect(FlipperConnectionManager*) {
if (status_ != Status::Unconnected) {
return false;
return;
}
status_ = Status::Connecting;
@@ -89,7 +89,8 @@ bool WebSocketClient::connect(FlipperConnectionManager* manager) {
if (ec) {
status_ = Status::Failed;
return false;
eventHandler_(SocketEvent::ERROR);
return;
}
handle_ = connection_->get_handle();
@@ -119,18 +120,7 @@ bool WebSocketClient::connect(FlipperConnectionManager* manager) {
&socket_,
websocketpp::lib::placeholders::_1));
auto connected = connected_.get_future();
socket_.connect(connection_);
auto state = connected.wait_for(std::chrono::seconds(10));
if (state == std::future_status::ready) {
return connected.get();
}
disconnect();
return false;
}
void WebSocketClient::disconnect() {
@@ -147,8 +137,6 @@ void WebSocketClient::disconnect() {
thread_->join();
}
thread_ = nullptr;
scheduler_->schedule(
[eventHandler = eventHandler_]() { eventHandler(SocketEvent::CLOSE); });
}
void WebSocketClient::send(
@@ -204,8 +192,7 @@ void WebSocketClient::onOpen(SocketClient* c, websocketpp::connection_hdl hdl) {
}
status_ = Status::Initializing;
scheduler_->schedule(
[eventHandler = eventHandler_]() { eventHandler(SocketEvent::OPEN); });
eventHandler_(SocketEvent::OPEN);
}
void WebSocketClient::onMessage(
@@ -229,16 +216,14 @@ void WebSocketClient::onFail(SocketClient* c, websocketpp::connection_hdl hdl) {
connected_.set_value(false);
}
status_ = Status::Failed;
scheduler_->schedule(
[eventHandler = eventHandler_]() { eventHandler(SocketEvent::ERROR); });
eventHandler_(SocketEvent::ERROR);
}
void WebSocketClient::onClose(
SocketClient* c,
websocketpp::connection_hdl hdl) {
status_ = Status::Closed;
scheduler_->schedule(
[eventHandler = eventHandler_]() { eventHandler(SocketEvent::CLOSE); });
eventHandler_(SocketEvent::CLOSE);
}
} // namespace flipper