/** * Copyright (c) 2019-2021 Paul-Louis Ageneau * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #ifndef RTC_IMPL_PEER_CONNECTION_H #define RTC_IMPL_PEER_CONNECTION_H #include "common.hpp" #include "datachannel.hpp" #include "dtlstransport.hpp" #include "icetransport.hpp" #include "init.hpp" #include "processor.hpp" #include "sctptransport.hpp" #include "track.hpp" #include "rtc/peerconnection.hpp" #include #include #include #include namespace rtc::impl { struct PeerConnection : std::enable_shared_from_this { using State = rtc::PeerConnection::State; using IceState = rtc::PeerConnection::IceState; using GatheringState = rtc::PeerConnection::GatheringState; using SignalingState = rtc::PeerConnection::SignalingState; PeerConnection(Configuration config_); ~PeerConnection(); void close(); void remoteClose(); optional localDescription() const; optional remoteDescription() const; size_t remoteMaxMessageSize() const; shared_ptr initIceTransport(); shared_ptr initDtlsTransport(); shared_ptr initSctpTransport(); shared_ptr getIceTransport() const; shared_ptr getDtlsTransport() const; shared_ptr getSctpTransport() const; void closeTransports(); void endLocalCandidates(); void rollbackLocalDescription(); bool checkFingerprint(const std::string &fingerprint) const; void forwardMessage(message_ptr message); void forwardMedia(message_ptr message); void forwardBufferedAmount(uint16_t stream, size_t amount); shared_ptr emplaceDataChannel(string label, DataChannelInit init); std::pair, bool> findDataChannel(uint16_t stream); bool removeDataChannel(uint16_t stream); uint16_t maxDataChannelStream() const; void assignDataChannels(); void iterateDataChannels(std::function channel)> func); void openDataChannels(); void closeDataChannels(); void remoteCloseDataChannels(); shared_ptr emplaceTrack(Description::Media description); void iterateTracks(std::function track)> func); void openTracks(); void closeTracks(); void validateRemoteDescription(const Description &description); void processLocalDescription(Description description); void processLocalCandidate(Candidate candidate); void processRemoteDescription(Description description); void processRemoteCandidate(Candidate candidate); string localBundleMid() const; void setMediaHandler(shared_ptr handler); shared_ptr getMediaHandler(); void triggerDataChannel(weak_ptr weakDataChannel); void triggerTrack(weak_ptr weakTrack); void triggerPendingDataChannels(); void triggerPendingTracks(); void flushPendingDataChannels(); void flushPendingTracks(); bool changeState(State newState); bool changeIceState(IceState newState); bool changeGatheringState(GatheringState newState); bool changeSignalingState(SignalingState newState); void resetCallbacks(); // Helper method for asynchronous callback invocation template void trigger(synchronized_callback *cb, Args... args) { try { (*cb)(std::move(args...)); } catch (const std::exception &e) { PLOG_WARNING << "Uncaught exception in callback: " << e.what(); } } const Configuration config; std::atomic state = State::New; std::atomic iceState = IceState::New; std::atomic gatheringState = GatheringState::New; std::atomic signalingState = SignalingState::Stable; std::atomic negotiationNeeded = false; std::atomic closing = false; std::mutex signalingMutex; synchronized_callback> dataChannelCallback; synchronized_callback localDescriptionCallback; synchronized_callback localCandidateCallback; synchronized_callback stateChangeCallback; synchronized_callback iceStateChangeCallback; synchronized_callback gatheringStateChangeCallback; synchronized_callback signalingStateChangeCallback; synchronized_callback> trackCallback; private: void updateTrackSsrcCache(const Description &description); const init_token mInitToken = Init::Instance().token(); const future_certificate_ptr mCertificate; Processor mProcessor; optional mLocalDescription, mRemoteDescription; optional mCurrentLocalDescription; mutable std::mutex mLocalDescriptionMutex, mRemoteDescriptionMutex; shared_ptr mMediaHandler; mutable std::shared_mutex mMediaHandlerMutex; shared_ptr mIceTransport; shared_ptr mDtlsTransport; shared_ptr mSctpTransport; std::unordered_map> mDataChannels; // by stream ID std::vector> mUnassignedDataChannels; std::shared_mutex mDataChannelsMutex; std::unordered_map> mTracks; // by mid std::unordered_map> mTracksBySsrc; // by SSRC std::vector> mTrackLines; // by SDP order std::shared_mutex mTracksMutex; Queue> mPendingDataChannels; Queue> mPendingTracks; }; } // namespace rtc::impl #endif