MediaTransportHandler.h (8059B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 3 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 #ifndef _MTRANSPORTHANDLER_H__ 6 #define _MTRANSPORTHANDLER_H__ 7 8 #include <set> 9 #include <string> 10 #include <vector> 11 12 #include "MediaEventSource.h" 13 #include "RTCStatsReport.h" 14 #include "common/CandidateInfo.h" 15 #include "mozilla/RefPtr.h" 16 #include "mozilla/dom/RTCConfigurationBinding.h" 17 #include "mozilla/dom/RTCIceTransportBinding.h" // RTCIceTransportState 18 #include "mozilla/dom/RTCPeerConnectionBinding.h" 19 #include "nsISupportsImpl.h" 20 #include "nsString.h" 21 #include "transport/dtlsidentity.h" // For DtlsDigest 22 #include "transport/nr_socket_proxy_config.h" 23 #include "transport/nricectx.h" // Need some enums 24 #include "transport/transportlayer.h" // Need the State enum 25 26 namespace mozilla { 27 class DtlsIdentity; 28 class NrIceCtx; 29 class NrIceMediaStream; 30 class NrIceResolver; 31 class TransportFlow; 32 class RTCStatsQuery; 33 34 namespace dom { 35 struct RTCStatsReportInternal; 36 } 37 38 class MediaTransportHandler { 39 public: 40 // Creates either a MediaTransportHandlerSTS or a MediaTransportHandlerIPC, 41 // as appropriate. 42 static already_AddRefed<MediaTransportHandler> Create(); 43 44 explicit MediaTransportHandler() 45 : mStateCacheMutex("MediaTransportHandler::mStateCacheMutex") {} 46 47 // Exposed so we can synchronously validate ICE servers from PeerConnection 48 static nsresult ConvertIceServers( 49 const nsTArray<dom::RTCIceServer>& aIceServers, 50 std::vector<NrIceStunServer>* aStunServers, 51 std::vector<NrIceTurnServer>* aTurnServers); 52 53 typedef MozPromise<dom::Sequence<nsString>, nsresult, true> IceLogPromise; 54 55 virtual void Initialize() {} 56 57 // There's a wrinkle here; the ICE logging is not separated out by 58 // MediaTransportHandler. These are a little more like static methods, but 59 // to avoid needing yet another IPC interface, we bolt them on here. 60 virtual RefPtr<IceLogPromise> GetIceLog(const nsCString& aPattern) = 0; 61 virtual void ClearIceLog() = 0; 62 virtual void EnterPrivateMode() = 0; 63 virtual void ExitPrivateMode() = 0; 64 65 virtual void CreateIceCtx(const std::string& aName) = 0; 66 67 virtual nsresult SetIceConfig(const nsTArray<dom::RTCIceServer>& aIceServers, 68 dom::RTCIceTransportPolicy aIcePolicy) = 0; 69 70 // We will probably be able to move the proxy lookup stuff into 71 // this class once we move mtransport to its own process. 72 virtual void SetProxyConfig(NrSocketProxyConfig&& aProxyConfig) = 0; 73 74 virtual void EnsureProvisionalTransport(const std::string& aTransportId, 75 const std::string& aLocalUfrag, 76 const std::string& aLocalPwd, 77 int aComponentCount) = 0; 78 79 virtual void SetTargetForDefaultLocalAddressLookup( 80 const std::string& aTargetIp, uint16_t aTargetPort) = 0; 81 82 // We set default-route-only as late as possible because it depends on what 83 // capture permissions have been granted on the window, which could easily 84 // change between Init (ie; when the PC is created) and StartIceGathering 85 // (ie; when we set the local description). 86 virtual void StartIceGathering(bool aDefaultRouteOnly, 87 bool aObfuscateHostAddresses, 88 // TODO: It probably makes sense to look 89 // this up internally 90 const nsTArray<NrIceStunAddr>& aStunAddrs) = 0; 91 92 virtual void ActivateTransport( 93 const std::string& aTransportId, const std::string& aLocalUfrag, 94 const std::string& aLocalPwd, size_t aComponentCount, 95 const std::string& aUfrag, const std::string& aPassword, 96 const nsTArray<uint8_t>& aKeyDer, const nsTArray<uint8_t>& aCertDer, 97 SSLKEAType aAuthType, bool aDtlsClient, const DtlsDigestList& aDigests, 98 bool aPrivacyRequested) = 0; 99 100 virtual void RemoveTransportsExcept( 101 const std::set<std::string>& aTransportIds) = 0; 102 103 virtual void StartIceChecks(bool aIsControlling, 104 const std::vector<std::string>& aIceOptions) = 0; 105 106 virtual void SendPacket(const std::string& aTransportId, 107 MediaPacket&& aPacket) = 0; 108 109 virtual void AddIceCandidate(const std::string& aTransportId, 110 const std::string& aCandidate, 111 const std::string& aUFrag, 112 const std::string& aObfuscatedAddress) = 0; 113 114 virtual void UpdateNetworkState(bool aOnline) = 0; 115 116 virtual RefPtr<dom::RTCStatsPromise> GetIceStats( 117 const std::string& aTransportId, DOMHighResTimeStamp aNow) = 0; 118 119 NS_INLINE_DECL_THREADSAFE_REFCOUNTING_WITH_DESTROY(MediaTransportHandler, 120 Destroy()) 121 122 TransportLayer::State GetState(const std::string& aTransportId, 123 bool aRtcp) const; 124 125 MediaEventSourceOneCopyPerThread<std::string, MediaPacket>& 126 GetRtpPacketReceived() { 127 return mRtpPacketReceived; 128 } 129 130 MediaEventSourceOneCopyPerThread<std::string, MediaPacket>& 131 GetSctpPacketReceived() { 132 return mSctpPacketReceived; 133 } 134 135 MediaEventSource<std::string, CandidateInfo>& GetCandidateGathered() { 136 return mCandidateGathered; 137 } 138 139 MediaEventSource<std::string, bool>& GetAlpnNegotiated() { 140 return mAlpnNegotiated; 141 } 142 143 MediaEventSource<std::string, dom::RTCIceGathererState>& 144 GetGatheringStateChange() { 145 return mGatheringStateChange; 146 } 147 MediaEventSource<std::string, dom::RTCIceTransportState>& 148 GetConnectionStateChange() { 149 return mConnectionStateChange; 150 } 151 MediaEventSource<std::string, MediaPacket>& GetEncryptedSending() { 152 return mEncryptedSending; 153 } 154 MediaEventSource<std::string, TransportLayer::State>& GetStateChange() { 155 return mStateChange; 156 } 157 MediaEventSource<std::string, TransportLayer::State>& GetRtcpStateChange() { 158 return mRtcpStateChange; 159 } 160 161 protected: 162 void OnCandidate(const std::string& aTransportId, 163 CandidateInfo&& aCandidateInfo); 164 void OnAlpnNegotiated(const std::string& aAlpn); 165 void OnGatheringStateChange(const std::string& aTransportId, 166 dom::RTCIceGathererState aState); 167 void OnConnectionStateChange(const std::string& aTransportId, 168 dom::RTCIceTransportState aState); 169 void OnPacketReceived(std::string&& aTransportId, MediaPacket&& aPacket); 170 void OnEncryptedSending(const std::string& aTransportId, 171 MediaPacket&& aPacket); 172 void OnStateChange(const std::string& aTransportId, 173 TransportLayer::State aState); 174 void OnRtcpStateChange(const std::string& aTransportId, 175 TransportLayer::State aState); 176 virtual void Destroy() = 0; 177 virtual ~MediaTransportHandler() = default; 178 mutable Mutex mStateCacheMutex; 179 std::map<std::string, TransportLayer::State> mStateCache; 180 std::map<std::string, TransportLayer::State> mRtcpStateCache; 181 182 // Just RTP/RTCP 183 MediaEventProducerOneCopyPerThread<std::string, MediaPacket> 184 mRtpPacketReceived; 185 // Just SCTP 186 MediaEventProducerOneCopyPerThread<std::string, MediaPacket> 187 mSctpPacketReceived; 188 MediaEventProducer<std::string, CandidateInfo> mCandidateGathered; 189 MediaEventProducer<std::string, bool> mAlpnNegotiated; 190 MediaEventProducer<std::string, dom::RTCIceGathererState> 191 mGatheringStateChange; 192 MediaEventProducer<std::string, dom::RTCIceTransportState> 193 mConnectionStateChange; 194 MediaEventProducer<std::string, MediaPacket> mEncryptedSending; 195 MediaEventProducer<std::string, TransportLayer::State> mStateChange; 196 MediaEventProducer<std::string, TransportLayer::State> mRtcpStateChange; 197 }; 198 199 void TokenizeCandidate(const std::string& aCandidate, 200 std::vector<std::string>& aTokens); 201 202 } // namespace mozilla 203 204 #endif //_MTRANSPORTHANDLER_H__