[feat] support libdatachannel ICE interaction

This commit is contained in:
dijunkun
2025-11-03 00:22:23 +08:00
parent 0ba48b7ede
commit 477c62bb12
5 changed files with 74 additions and 0 deletions
+57
View File
@@ -168,6 +168,63 @@ bool SignalNegotiation::query_user_id_list(websocketpp::connection_hdl hdl,
return true;
}
bool SignalNegotiation::join_transmission(websocketpp::connection_hdl hdl,
const json& j) {
std::string transmission_id_pwd = j["transmission_id"].get<std::string>();
std::string transmission_id;
std::string password;
if (transmission_id_pwd.find("@") != std::string::npos) {
transmission_id =
transmission_id_pwd.substr(0, transmission_id_pwd.find("@"));
password = transmission_id_pwd.substr(transmission_id_pwd.find("@") + 1);
} else {
transmission_id = transmission_id_pwd;
password = "";
}
std::string user_id = j["user_id"].get<std::string>();
LOG_INFO("[{}] joins transmission [{}]", user_id.c_str(),
transmission_id.c_str());
int ret = device_db_manager_->VerifyDevice(transmission_id, password);
if (0 == ret) {
transmission_manager_->BindGuestToTransmission(user_id, transmission_id);
json message = {{"type", "user_join_transmission"},
{"transmission_id", transmission_id},
{"user_id", user_id},
{"status", "success"}};
std::string host_id =
transmission_manager_->GetHostIdOfTransmission(transmission_id);
if (!host_id.empty()) {
send_msg_(transmission_manager_->GetWsHandle(host_id), message);
}
} else if (-1 == ret) {
LOG_ERROR("Password incorrect for transmission id [{}]",
transmission_id.c_str());
json message = {{"type", "user_join_transmission"},
{"transmission_id", transmission_id},
{"status", "failed"},
{"reason", "Incorrect password"}};
send_msg_(hdl, message);
} else if (-2 == ret) {
LOG_ERROR("No such transmission id [{}]", transmission_id.c_str());
json message = {{"type", "user_join_transmission"},
{"transmission_id", transmission_id},
{"status", "failed"},
{"reason", "No such transmission id"}};
send_msg_(hdl, message);
}
return true;
}
bool SignalNegotiation::offer(websocketpp::connection_hdl hdl, const json& j) {
std::string transmission_id = j["transmission_id"].get<std::string>();
std::string remote_user_id = j["remote_user_id"].get<std::string>();
+2
View File
@@ -28,6 +28,8 @@ class SignalNegotiation {
bool login_user(websocketpp::connection_hdl hdl, const json& j);
bool leave_transmission(websocketpp::connection_hdl hdl, const json& j);
bool query_user_id_list(websocketpp::connection_hdl hdl, const json& j);
bool join_transmission(websocketpp::connection_hdl hdl,
const json& j);
bool offer(websocketpp::connection_hdl hdl, const json& j);
bool answer(websocketpp::connection_hdl hdl, const json& j);
bool new_candidate(websocketpp::connection_hdl hdl, const json& j);
+3
View File
@@ -182,6 +182,9 @@ void SignalServer::OnMessage(websocketpp::connection_hdl hdl,
case "query_user_id_list"_H:
signal_negotiation_->query_user_id_list(hdl, j);
break;
case "join_transmission"_H:
signal_negotiation_->join_transmission(hdl, j);
break;
case "offer"_H:
signal_negotiation_->offer(hdl, j);
break;
+10
View File
@@ -71,6 +71,16 @@ std::vector<std::string> TransmissionManager::GetAllUserIdOfTransmission(
return result;
}
std::string TransmissionManager::GetHostIdOfTransmission(
const std::string& transmission_id) {
std::lock_guard<std::recursive_mutex> lock(ws_hdl_alive_checker_mutex_);
if (transmission_host_id_list_.count(transmission_id)) {
return transmission_host_id_list_[transmission_id];
}
return "";
}
bool TransmissionManager::BindHostToTransmission(
const std::string& host_id, const std::string& transmission_id) {
std::lock_guard<std::recursive_mutex> lock(ws_hdl_alive_checker_mutex_);
+2
View File
@@ -30,6 +30,8 @@ class TransmissionManager {
std::vector<std::string> GetAllUserIdOfTransmission(
const std::string& transmission_id);
std::string GetHostIdOfTransmission(const std::string& transmission_id);
bool BindHostToTransmission(const std::string& host_id,
const std::string& transmission_id);
bool BindGuestToTransmission(const std::string& guest_id,