/** WebRTC peer connection * * @file * @author Steffen Vogel * @author Philipp Jungkamp * @copyright 2014-2022, Institute for Automation of Complex Power Systems, EONERC * @copyright 2023, OPAL-RT Germany GmbH * @license Apache 2.0 *********************************************************************************/ #pragma once #include #include #include #include #include #include namespace villas { namespace node { namespace webrtc { class PeerConnection { public: PeerConnection(const std::string &server, const std::string &session, const std::string &peer, std::shared_ptr signals, rtc::Configuration config, Web *w, rtc::DataChannelInit d); ~PeerConnection(); bool waitForDataChannel(std::chrono::seconds timeout); void onMessage(std::function callback); void sendMessage(rtc::binary msg); json_t * readStatus() const; void connect(); void disconnect(); protected: Web *web; std::vector extraServers; rtc::DataChannelInit dataChannelInit; rtc::Configuration defaultConfig; std::shared_ptr conn; std::shared_ptr chan; std::shared_ptr client; std::shared_ptr signals; Logger logger; std::mutex mutex; std::condition_variable_any startupCondition; bool stopStartup; bool warnNotConnected; bool standby; bool first; int firstID; int secondID; std::function onMessageCallback; void resetConnection(std::unique_lock &lock); void resetConnectionAndStandby(std::unique_lock &lock); void notifyStartup(); void setupPeerConnection(std::shared_ptr = nullptr); void setupDataChannel(std::shared_ptr = nullptr); void onLocalDescription(rtc::Description sdp); void onLocalCandidate(rtc::Candidate cand); void onConnectionStateChange(rtc::PeerConnection::State state); void onSignalingStateChange(rtc::PeerConnection::SignalingState state); void onGatheringStateChange(rtc::PeerConnection::GatheringState state); void onSignalingConnected(); void onSignalingDisconnected(); void onSignalingError(std::string err); void onSignalingMessage(SignalingMessage msg); void onDataChannel(std::shared_ptr dc); void onDataChannelOpen(); void onDataChannelClosed(); void onDataChannelError(std::string err); void onDataChannelMessage(rtc::string msg); void onDataChannelMessage(rtc::binary msg); }; } /* namespace webrtc */ } /* namespace node */ } /* namespace villas */