From e31405c78b83c91f1e1827d8f9bbcaea2e64234d Mon Sep 17 00:00:00 2001 From: dijunkun Date: Thu, 24 Aug 2023 09:57:55 +0800 Subject: [PATCH] Release ice instance when a user leave transmission --- src/ice/ice_transmission.cpp | 23 +++++++--------- src/pc/peer_connection.cpp | 28 ++++++++++++++++++++ tests/signal_server/signal_server.cpp | 8 +++--- tests/signal_server/transmission_manager.cpp | 1 + 4 files changed, 44 insertions(+), 16 deletions(-) diff --git a/src/ice/ice_transmission.cpp b/src/ice/ice_transmission.cpp index 0d0a7e8..296d03a 100644 --- a/src/ice/ice_transmission.cpp +++ b/src/ice/ice_transmission.cpp @@ -25,7 +25,12 @@ IceTransmission::IceTransmission( ice_ws_transport_(ice_ws_transmission), on_receive_ice_msg_cb_(on_receive_ice_msg) {} -IceTransmission::~IceTransmission() {} +IceTransmission::~IceTransmission() { + if (ice_agent_) { + delete ice_agent_; + ice_agent_ = nullptr; + } +} int IceTransmission::InitIceTransmission(std::string &ip, int port) { ice_agent_ = new IceAgent(ip, port); @@ -75,22 +80,15 @@ int IceTransmission::InitIceTransmission(std::string &ip, int port) { } int IceTransmission::DestroyIceTransmission() { - if (ice_agent_) { - delete ice_agent_; - } - return 0; + LOG_INFO("[{}] Destroy ice transmission", user_id_); + return ice_agent_->DestoryIceAgent(); } int IceTransmission::CreateTransmission(const std::string &transmission_id) { - LOG_INFO("Create transport"); + LOG_INFO("[{}] Create transmission", user_id_); offer_peer_ = false; transmission_id_ = transmission_id; - // if (SignalStatus::Connected != signal_status_) { - // LOG_ERROR("Not connect to signalserver"); - // return -1; - // } - json message = {{"type", "create_transmission"}, {"transmission_id", transmission_id}}; if (ice_ws_transport_) { @@ -98,7 +96,6 @@ int IceTransmission::CreateTransmission(const std::string &transmission_id) { LOG_INFO("Send msg: {}", message.dump().c_str()); } - // CreateOffer(); return 0; } @@ -109,7 +106,7 @@ int IceTransmission::SetTransmissionId(const std::string &transmission_id) { } int IceTransmission::JoinTransmission() { - LOG_INFO("Join transport"); + LOG_INFO("[{}] Join transmission", user_id_); CreateOffer(); return 0; diff --git a/src/pc/peer_connection.cpp b/src/pc/peer_connection.cpp index a4ab83a..2c1fe98 100644 --- a/src/pc/peer_connection.cpp +++ b/src/pc/peer_connection.cpp @@ -64,6 +64,20 @@ int PeerConnection::Create(PeerConnectionParams params, } break; } + case "user_leave_transmission"_H: { + std::string user_id = j["user_id"]; + LOG_INFO("Receive notification: user id [{}] leave transmission", + user_id); + auto user_id_it = ice_transmission_list_.find(user_id); + if (user_id_it != ice_transmission_list_.end()) { + user_id_it->second->DestroyIceTransmission(); + delete user_id_it->second; + user_id_it->second = nullptr; + ice_transmission_list_.erase(user_id_it); + LOG_INFO("Terminate transmission to user [{}]", user_id); + } + break; + } case "offer"_H: { std::string remote_sdp = j["sdp"].get(); @@ -169,6 +183,20 @@ int PeerConnection::Join(PeerConnectionParams params, break; } + case "user_leave_transmission"_H: { + std::string user_id = j["user_id"]; + LOG_INFO("Receive notification: user id [{}] leave transmission", + user_id); + auto user_id_it = ice_transmission_list_.find(user_id); + if (user_id_it != ice_transmission_list_.end()) { + user_id_it->second->DestroyIceTransmission(); + delete user_id_it->second; + user_id_it->second = nullptr; + ice_transmission_list_.erase(user_id_it); + LOG_INFO("Terminate transmission to user [{}]", user_id); + } + break; + } case "ws_connection_id"_H: { ws_connection_id_ = j["ws_connection_id"].get(); LOG_INFO("Receive local peer websocket connection id [{}]", diff --git a/tests/signal_server/signal_server.cpp b/tests/signal_server/signal_server.cpp index b1692f6..3933e68 100644 --- a/tests/signal_server/signal_server.cpp +++ b/tests/signal_server/signal_server.cpp @@ -55,14 +55,16 @@ bool SignalServer::on_open(websocketpp::connection_hdl hdl) { bool SignalServer::on_close(websocketpp::connection_hdl hdl) { LOG_INFO("Websocket onnection [{}] closed", ws_connection_id_); + std::string user_id = transmission_manager_.GetUserId(hdl); std::string transmission_id = transmission_manager_.ReleaseUserIdFromTransmission(hdl); - std::vector user_id_list = - transmission_manager_.GetAllUserIdOfTransmission(transmission_id); json message = {{"type", "user_leave_transmission"}, {"transmission_id", transmission_id}, - {"user_id", transmission_manager_.GetUserId(hdl)}}; + {"user_id", user_id}}; + + std::vector user_id_list = + transmission_manager_.GetAllUserIdOfTransmission(transmission_id); for (const auto& user_id : user_id_list) { send_msg(transmission_manager_.GetWsHandle(user_id), message); diff --git a/tests/signal_server/transmission_manager.cpp b/tests/signal_server/transmission_manager.cpp index 395c782..32a2f06 100644 --- a/tests/signal_server/transmission_manager.cpp +++ b/tests/signal_server/transmission_manager.cpp @@ -88,6 +88,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); if (it->second.lock().get() == hdl.lock().get()) return it->first; } return "";