From 20dc83bee4dc05557f88e7a45f688ad0cd40b1b3 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 29 Jun 2023 05:53:04 +0000 Subject: [PATCH] webrtc: Add peer option Signed-off-by: Steffen Vogel --- include/villas/nodes/webrtc.hpp | 1 + include/villas/nodes/webrtc/peer_connection.hpp | 2 +- include/villas/nodes/webrtc/signaling_client.hpp | 2 +- lib/nodes/webrtc.cpp | 7 ++++++- lib/nodes/webrtc/peer_connection.cpp | 2 +- lib/nodes/webrtc/signaling_client.cpp | 15 +++++++++++---- 6 files changed, 21 insertions(+), 8 deletions(-) diff --git a/include/villas/nodes/webrtc.hpp b/include/villas/nodes/webrtc.hpp index c9bede10e..5fb306418 100644 --- a/include/villas/nodes/webrtc.hpp +++ b/include/villas/nodes/webrtc.hpp @@ -30,6 +30,7 @@ class WebRTCNode : public Node { protected: std::string server; std::string session; + std::string peer; int wait_seconds; Format *format; diff --git a/include/villas/nodes/webrtc/peer_connection.hpp b/include/villas/nodes/webrtc/peer_connection.hpp index 6dd8f94cb..d26eda69d 100644 --- a/include/villas/nodes/webrtc/peer_connection.hpp +++ b/include/villas/nodes/webrtc/peer_connection.hpp @@ -23,7 +23,7 @@ namespace webrtc { class PeerConnection { public: - PeerConnection(const std::string &server, const std::string &session, rtc::Configuration config, Web *w, rtc::DataChannelInit d); + PeerConnection(const std::string &server, const std::string &session, const std::string &peer, rtc::Configuration config, Web *w, rtc::DataChannelInit d); ~PeerConnection(); bool waitForDataChannel(std::chrono::seconds timeout); diff --git a/include/villas/nodes/webrtc/signaling_client.hpp b/include/villas/nodes/webrtc/signaling_client.hpp index 7239de76a..970d466ba 100644 --- a/include/villas/nodes/webrtc/signaling_client.hpp +++ b/include/villas/nodes/webrtc/signaling_client.hpp @@ -81,7 +81,7 @@ protected: int writable(); public: - SignalingClient(const std::string &server, const std::string &session, Web *w); + SignalingClient(const std::string &server, const std::string &session, const std::string &peer, Web *w); ~SignalingClient(); static diff --git a/lib/nodes/webrtc.cpp b/lib/nodes/webrtc.cpp index 64510e4ac..881e1af2d 100644 --- a/lib/nodes/webrtc.cpp +++ b/lib/nodes/webrtc.cpp @@ -50,14 +50,16 @@ int WebRTCNode::parse(json_t *json, const uuid_t sn_uuid) const char *sess; const char *svr = nullptr; + const char *pr = nullptr; int ord = -1; int &rexmit = dci.reliability.rexmit.emplace(0); json_t *ice_json = nullptr; json_t *fmt_json = nullptr; json_error_t err; - ret = json_unpack_ex(json, &err, 0, "{ s:s, s?s, s?i, s?i, s?b, s?o }", + ret = json_unpack_ex(json, &err, 0, "{ s:s, s?:s, s?s, s?i, s?i, s?b, s?o }", "session", &sess, + "peer", &pr, "server", &svr, "wait_seconds", &wait_seconds, "max_retransmits", &rexmit, @@ -73,6 +75,9 @@ int WebRTCNode::parse(json_t *json, const uuid_t sn_uuid) if (svr) server = svr; + if (pr) + peer = pr; + if (ord) dci.reliability.unordered = !ord; diff --git a/lib/nodes/webrtc/peer_connection.cpp b/lib/nodes/webrtc/peer_connection.cpp index 8c1e28ba9..27a1bc978 100644 --- a/lib/nodes/webrtc/peer_connection.cpp +++ b/lib/nodes/webrtc/peer_connection.cpp @@ -55,7 +55,7 @@ PeerConnection::PeerConnection(const std::string &server, const std::string &ses secondID(INT_MAX), onMessageCallback(nullptr) { - client = std::make_shared(server, session, web); + client = std::make_shared(server, session, peer, web); client->onConnected([this](){ this->onSignalingConnected(); }); client->onDisconnected([this](){ this->onSignalingDisconnected(); }); client->onError([this](auto err){ this->onSignalingError(std::move(err)); }); diff --git a/lib/nodes/webrtc/signaling_client.cpp b/lib/nodes/webrtc/signaling_client.cpp index b6a299fd7..3222f5b61 100644 --- a/lib/nodes/webrtc/signaling_client.cpp +++ b/lib/nodes/webrtc/signaling_client.cpp @@ -7,16 +7,20 @@ * @license Apache 2.0 *********************************************************************************/ +#include + +#include #include #include #include #include using namespace villas; +using namespace villas::utils; using namespace villas::node; using namespace villas::node::webrtc; -SignalingClient::SignalingClient(const std::string &srv, const std::string &sess, Web *w) : +SignalingClient::SignalingClient(const std::string &server, const std::string &session, const std::string &peer, Web *w) : retry_count(0), web(w), running(false), @@ -27,10 +31,13 @@ SignalingClient::SignalingClient(const std::string &srv, const std::string &sess memset(&info, 0, sizeof(info)); - ret = asprintf(&uri, "%s/%s", srv.c_str(), sess.c_str()); + ret = asprintf(&uri, "%s/%s", server.c_str(), session.c_str()); if (ret < 0) throw RuntimeError { "Could not format signaling server uri" }; + if (!peer.empty()) + strcatf(&uri, "/%s", peer.c_str()); + ret = lws_parse_uri(uri, &prot, &a, &info.port, &p); if (ret) throw RuntimeError("Failed to parse WebSocket URI: '{}'", uri); @@ -120,7 +127,7 @@ int SignalingClient::protocolCallback(struct lws *wsi, enum lws_callback_reasons buffer.append((char *) in, len); if (lws_is_final_fragment(wsi)) { - logger->trace("Received signaling message: {:.{}}", buffer.data(), buffer.size()); + logger->trace("Signaling message received: {:.{}}", buffer.data(), buffer.size()); auto *json = buffer.decode(); if (json == nullptr) { @@ -201,7 +208,7 @@ int SignalingClient::writable() if (len > sizeof(buf) - LWS_PRE) return -1; - logger->trace("Sending signaling message: {:.{}}", buf + LWS_PRE, len); + logger->trace("Signaling message send: {:.{}}", buf + LWS_PRE, len); auto ret = lws_write(wsi, (unsigned char *) buf + LWS_PRE, len, LWS_WRITE_TEXT); if (ret < 0)