diff --git a/ntgcalls/client.cpp b/ntgcalls/client.cpp index 392cd8a8..023b9901 100644 --- a/ntgcalls/client.cpp +++ b/ntgcalls/client.cpp @@ -47,74 +47,77 @@ namespace ntgcalls { stream->setAVStream(config); } - void Client::connect(const std::string& jsonData) const - { - auto data = json::parse(jsonData); - if (!data["rtmp"].is_null()) { - throw RTMPNeeded("Needed rtmp connection"); - } - if (data["transport"].is_null()) { - throw InvalidParams("Transport not found"); - } - data = data["transport"]; - wrtc::Conference conference; + void Client::connect(const std::string& jsonData) const { try { - conference = { - { - data["ufrag"].get(), - data["pwd"].get() - }, - audioSource, - sourceGroups - }; - for (const auto& item : data["fingerprints"].items()) { - conference.transport.fingerprints.push_back({ - item.value()["hash"], - item.value()["fingerprint"], - }); + auto data = json::parse(jsonData); + if (!data["rtmp"].is_null()) { + throw RTMPNeeded("Needed rtmp connection"); } - for (const auto& item : data["candidates"].items()) { - conference.transport.candidates.push_back({ - item.value()["generation"].get(), - item.value()["component"].get(), - item.value()["protocol"].get(), - item.value()["port"].get(), - item.value()["ip"].get(), - item.value()["foundation"].get(), - item.value()["id"].get(), - item.value()["priority"].get(), - item.value()["type"].get(), - item.value()["network"].get() - }); + if (data["transport"].is_null()) { + throw InvalidParams("Transport not found"); } - } catch (...) { - throw InvalidParams("Invalid transport"); - } - - const auto remoteDescription = wrtc::Description( - wrtc::Description::Type::Answer, - wrtc::SdpBuilder::fromConference(conference) - ); - connection->setRemoteDescription(remoteDescription); - - wrtc::Sync waitConnection; - connection->onIceStateChange([&waitConnection](const wrtc::IceState state) { - switch (state) { - case wrtc::IceState::Connected: - waitConnection.onSuccess(); - break; - case wrtc::IceState::Disconnected: - case wrtc::IceState::Failed: - case wrtc::IceState::Closed: - waitConnection.onFailed(ConnectionError("Connection failed to Telegram WebRTC")); - break; - default: - break; + data = data["transport"]; + wrtc::Conference conference; + try { + conference = { + { + data["ufrag"].get(), + data["pwd"].get() + }, + audioSource, + sourceGroups + }; + for (const auto& item : data["fingerprints"].items()) { + conference.transport.fingerprints.push_back({ + item.value()["hash"], + item.value()["fingerprint"], + }); + } + for (const auto& item : data["candidates"].items()) { + conference.transport.candidates.push_back({ + item.value()["generation"].get(), + item.value()["component"].get(), + item.value()["protocol"].get(), + item.value()["port"].get(), + item.value()["ip"].get(), + item.value()["foundation"].get(), + item.value()["id"].get(), + item.value()["priority"].get(), + item.value()["type"].get(), + item.value()["network"].get() + }); + } + } catch (...) { + throw InvalidParams("Invalid transport"); } - }); - waitConnection.wait(); - connection->onIceStateChange(nullptr); - stream->start(); + + const auto remoteDescription = wrtc::Description( + wrtc::Description::Type::Answer, + wrtc::SdpBuilder::fromConference(conference) + ); + connection->setRemoteDescription(remoteDescription); + + wrtc::Sync waitConnection; + connection->onIceStateChange([&waitConnection](const wrtc::IceState state) { + switch (state) { + case wrtc::IceState::Connected: + waitConnection.onSuccess(); + break; + case wrtc::IceState::Disconnected: + case wrtc::IceState::Failed: + case wrtc::IceState::Closed: + waitConnection.onFailed(ConnectionError("Connection failed to Telegram WebRTC")); + break; + default: + break; + } + }); + waitConnection.wait(); + connection->onIceStateChange(nullptr); + stream->start(); + } catch (const std::exception &exc) { + throw wrtc::RTCException(exc.what()); + } } bool Client::pause() const {