Use "= default" to denote default constructor or destructor
[WebKit-https.git] / Source / WebCore / Modules / mediastream / PeerConnectionBackend.h
1 /*
2  * Copyright (C) 2015 Ericsson AB. All rights reserved.
3  * Copyright (C) 2017 Apple Inc. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer
13  *    in the documentation and/or other materials provided with the
14  *    distribution.
15  * 3. Neither the name of Ericsson nor the names of its contributors
16  *    may be used to endorse or promote products derived from this
17  *    software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31
32 #pragma once
33
34 #if ENABLE(WEB_RTC)
35
36 #include "JSDOMPromiseDeferred.h"
37 #include "RTCRtpParameters.h"
38 #include "RTCSessionDescription.h"
39 #include "RTCSignalingState.h"
40 #include <pal/Logger.h>
41 #include <pal/LoggerHelper.h>
42
43 namespace WebCore {
44
45 class MediaStream;
46 class MediaStreamTrack;
47 class PeerConnectionBackend;
48 class RTCDataChannelHandler;
49 class RTCIceCandidate;
50 class RTCPeerConnection;
51 class RTCRtpReceiver;
52 class RTCRtpSender;
53 class RTCSessionDescription;
54 class RTCStatsReport;
55
56 struct MediaEndpointConfiguration;
57 struct RTCAnswerOptions;
58 struct RTCDataChannelInit;
59 struct RTCOfferOptions;
60
61 namespace PeerConnection {
62 using SessionDescriptionPromise = DOMPromiseDeferred<IDLDictionary<RTCSessionDescription::Init>>;
63 using StatsPromise = DOMPromiseDeferred<IDLInterface<RTCStatsReport>>;
64 }
65
66 using CreatePeerConnectionBackend = std::unique_ptr<PeerConnectionBackend> (*)(RTCPeerConnection&);
67
68 class PeerConnectionBackend
69 #if !RELEASE_LOG_DISABLED
70     : public PAL::LoggerHelper
71 #endif
72 {
73 public:
74     WEBCORE_EXPORT static CreatePeerConnectionBackend create;
75
76     explicit PeerConnectionBackend(RTCPeerConnection&);
77     virtual ~PeerConnectionBackend() = default;
78
79     void createOffer(RTCOfferOptions&&, PeerConnection::SessionDescriptionPromise&&);
80     void createAnswer(RTCAnswerOptions&&, PeerConnection::SessionDescriptionPromise&&);
81     void setLocalDescription(RTCSessionDescription&, DOMPromiseDeferred<void>&&);
82     void setRemoteDescription(RTCSessionDescription&, DOMPromiseDeferred<void>&&);
83     void addIceCandidate(RTCIceCandidate*, DOMPromiseDeferred<void>&&);
84
85     virtual std::unique_ptr<RTCDataChannelHandler> createDataChannelHandler(const String&, const RTCDataChannelInit&) = 0;
86
87     void stop();
88
89     virtual RefPtr<RTCSessionDescription> localDescription() const = 0;
90     virtual RefPtr<RTCSessionDescription> currentLocalDescription() const = 0;
91     virtual RefPtr<RTCSessionDescription> pendingLocalDescription() const = 0;
92
93     virtual RefPtr<RTCSessionDescription> remoteDescription() const = 0;
94     virtual RefPtr<RTCSessionDescription> currentRemoteDescription() const = 0;
95     virtual RefPtr<RTCSessionDescription> pendingRemoteDescription() const = 0;
96
97     virtual bool setConfiguration(MediaEndpointConfiguration&&) = 0;
98
99     virtual void getStats(MediaStreamTrack*, Ref<DeferredPromise>&&) = 0;
100
101     virtual Vector<RefPtr<MediaStream>> getRemoteStreams() const = 0;
102
103     virtual Ref<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) = 0;
104     virtual void replaceTrack(RTCRtpSender&, Ref<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&) = 0;
105     virtual void notifyAddedTrack(RTCRtpSender&) { }
106     virtual void notifyRemovedTrack(RTCRtpSender&) { }
107
108     virtual RTCRtpParameters getParameters(RTCRtpSender&) const { return { }; }
109
110     void markAsNeedingNegotiation();
111     bool isNegotiationNeeded() const { return m_negotiationNeeded; };
112     void clearNegotiationNeededState() { m_negotiationNeeded = false; };
113
114     virtual void emulatePlatformEvent(const String& action) = 0;
115
116     void newICECandidate(String&& sdp, String&& mid, unsigned short sdpMLineIndex);
117     void disableICECandidateFiltering();
118     void enableICECandidateFiltering();
119
120     virtual void applyRotationForOutgoingVideoSources() { }
121
122 #if !RELEASE_LOG_DISABLED
123     const PAL::Logger& logger() const final { return m_logger.get(); }
124     const void* logIdentifier() const final { return m_logIdentifier; }
125     const char* logClassName() const override { return "PeerConnectionBackend"; }
126     WTFLogChannel& logChannel() const final;
127 #endif
128
129 protected:
130     void fireICECandidateEvent(RefPtr<RTCIceCandidate>&&);
131     void doneGatheringCandidates();
132
133     void updateSignalingState(RTCSignalingState);
134
135     void createOfferSucceeded(String&&);
136     void createOfferFailed(Exception&&);
137
138     void createAnswerSucceeded(String&&);
139     void createAnswerFailed(Exception&&);
140
141     void setLocalDescriptionSucceeded();
142     void setLocalDescriptionFailed(Exception&&);
143
144     void setRemoteDescriptionSucceeded();
145     void setRemoteDescriptionFailed(Exception&&);
146
147     void addIceCandidateSucceeded();
148     void addIceCandidateFailed(Exception&&);
149
150     String filterSDP(String&&) const;
151
152 private:
153     virtual void doCreateOffer(RTCOfferOptions&&) = 0;
154     virtual void doCreateAnswer(RTCAnswerOptions&&) = 0;
155     virtual void doSetLocalDescription(RTCSessionDescription&) = 0;
156     virtual void doSetRemoteDescription(RTCSessionDescription&) = 0;
157     virtual void doAddIceCandidate(RTCIceCandidate&) = 0;
158     virtual void endOfIceCandidates(DOMPromiseDeferred<void>&& promise) { promise.resolve(); }
159     virtual void doStop() = 0;
160
161 protected:
162     RTCPeerConnection& m_peerConnection;
163
164 private:
165     std::optional<PeerConnection::SessionDescriptionPromise> m_offerAnswerPromise;
166     std::optional<DOMPromiseDeferred<void>> m_setDescriptionPromise;
167     std::optional<DOMPromiseDeferred<void>> m_addIceCandidatePromise;
168
169     bool m_shouldFilterICECandidates { true };
170     struct PendingICECandidate {
171         // Fields described in https://www.w3.org/TR/webrtc/#idl-def-rtcicecandidateinit.
172         String sdp;
173         String mid;
174         unsigned short sdpMLineIndex;
175     };
176     Vector<PendingICECandidate> m_pendingICECandidates;
177
178 #if !RELEASE_LOG_DISABLED
179     Ref<const PAL::Logger> m_logger;
180     const void* m_logIdentifier;
181 #endif
182     bool m_negotiationNeeded { false };
183 };
184
185 } // namespace WebCore
186
187 #endif // ENABLE(WEB_RTC)