diff --git a/application/signal_server/signal_server.cpp b/application/signal_server/signal_server.cpp index 08c5c33..ac65f63 100644 --- a/application/signal_server/signal_server.cpp +++ b/application/signal_server/signal_server.cpp @@ -59,21 +59,30 @@ bool SignalServer::on_close(websocketpp::connection_hdl hdl) { std::string transmission_id = transmission_manager_.ReleaseUserIdFromTransmission(hdl); - json message = {{"type", "user_leave_transmission"}, - {"transmission_id", transmission_id}, - {"user_id", user_id}}; + if (!transmission_id.empty()) { + json message = {{"type", "user_leave_transmission"}, + {"transmission_id", transmission_id}, + {"user_id", user_id}}; - std::vector user_id_list = - transmission_manager_.GetAllUserIdOfTransmission(transmission_id); + std::vector user_id_list = + transmission_manager_.GetAllUserIdOfTransmission(transmission_id); - if (user_id_list.empty()) { - transmission_list_.erase(transmission_id); - LOG_INFO("Release transmission [{}] due to no user in this transmission", - transmission_id); - } + if (user_id_list.empty()) { + transmission_list_.erase(transmission_id); + LOG_INFO("Release transmission [{}] due to no user in this transmission", + transmission_id); + } - for (const auto& user_id : user_id_list) { - send_msg(transmission_manager_.GetWsHandle(user_id), message); + if (std::string::npos != user_id.find("S-")) { + transmission_list_.erase(transmission_id); + transmission_manager_.ReleaseAllUserIdFromTransmission(transmission_id); + LOG_INFO("Release transmission [{}] due to server leaves", + transmission_id); + } + + for (const auto& user_id : user_id_list) { + send_msg(transmission_manager_.GetWsHandle(user_id), message); + } } ws_connections_.erase(hdl); diff --git a/application/signal_server/transmission_manager.cpp b/application/signal_server/transmission_manager.cpp index 32a2f06..4275f1c 100644 --- a/application/signal_server/transmission_manager.cpp +++ b/application/signal_server/transmission_manager.cpp @@ -75,6 +75,16 @@ std::string TransmissionManager::ReleaseUserIdFromTransmission( return ""; } +bool TransmissionManager::ReleaseAllUserIdFromTransmission( + const std::string& transmission_id) { + if (transmission_user_id_list_.end() != + transmission_user_id_list_.find(transmission_id)) { + transmission_user_id_list_[transmission_id].clear(); + transmission_user_id_list_.erase(transmission_id); + } + return true; +} + websocketpp::connection_hdl TransmissionManager::GetWsHandle( const std::string& user_id) { if (user_id_ws_hdl_list_.find(user_id) != user_id_ws_hdl_list_.end()) { @@ -88,7 +98,7 @@ websocketpp::connection_hdl TransmissionManager::GetWsHandle( std::string TransmissionManager::GetUserId(websocketpp::connection_hdl hdl) { for (auto it = user_id_ws_hdl_list_.begin(); it != user_id_ws_hdl_list_.end(); ++it) { - LOG_INFO("[{}]", it->first); + // LOG_INFO("[{}]", it->first); if (it->second.lock().get() == hdl.lock().get()) return it->first; } return ""; diff --git a/application/signal_server/transmission_manager.h b/application/signal_server/transmission_manager.h index 5591619..f262748 100644 --- a/application/signal_server/transmission_manager.h +++ b/application/signal_server/transmission_manager.h @@ -21,6 +21,7 @@ class TransmissionManager { websocketpp::connection_hdl hdl); std::string ReleaseUserIdFromTransmission(websocketpp::connection_hdl hdl); + bool ReleaseAllUserIdFromTransmission(const std::string& transmission_id); websocketpp::connection_hdl GetWsHandle(const std::string& user_id); std::string GetUserId(websocketpp::connection_hdl hdl); diff --git a/src/pc/peer_connection.cpp b/src/pc/peer_connection.cpp index 2568a96..e4bef7e 100644 --- a/src/pc/peer_connection.cpp +++ b/src/pc/peer_connection.cpp @@ -276,6 +276,12 @@ void PeerConnection::ProcessSignal(const std::string &signal) { user_id_it->second->DestroyIceTransmission(); ice_transmission_list_.erase(user_id_it); LOG_INFO("Terminate transmission to user [{}]", user_id); + + if (std::string::npos != user_id.find("S-")) { + LOG_INFO("Server leaves, try to rejoin transmission"); + + RequestTransmissionMemberList(transmission_id_); + } } break; }