blob: 1a95dec52de4bc38d08654494264c1eed6def8cd [file]
/*
* Copyright 2026 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef API_PEER_CONNECTION_TRACER_INTERFACE_H_
#define API_PEER_CONNECTION_TRACER_INTERFACE_H_
#include <optional>
#include "absl/strings/string_view.h"
#include "api/data_channel_interface.h"
#include "api/jsep.h"
#include "api/peer_connection_interface.h"
#include "api/rtc_error.h"
#include "rtc_base/system/rtc_export.h"
namespace webrtc {
// PeerConnectionTracerInterface is a passive, signaling-thread observer of
// PeerConnection lifecycle and operation events. It is intended for
// diagnostics and trace surfaces (e.g. chrome://webrtc-internals); it must
// not influence PeerConnection behaviour.
//
// Threading: every method is invoked on the PeerConnection's signaling
// thread. Implementations must not block; opening each method with
// RTC_DCHECK_DISALLOW_THREAD_BLOCKING_CALLS() (rtc_base/thread.h) is
// strongly recommended to catch accidental blocking calls in debug builds.
//
// Lifetime: an implementation is supplied via PeerConnectionDependencies at
// construction time and is owned by the PeerConnection for its entire
// lifetime. It cannot be reset or replaced.
//
// All methods are pure virtual: embedders must spell out every event,
// using `{}` for the ones they don't care about. Adding a method here is
// a breaking change for every implementer.
//
// Payloads are passed by const pointer/reference into long-lived objects
// owned by the PeerConnection. The tracer must not retain these pointers
// past the call; it should serialize lazily, only on demand. Passing
// pointers (rather than pre-serialized strings) keeps the cost near zero
// when no tracer is attached or when a particular event is unobserved.
//
// This interface is not the place to observe per-message data-channel
// traffic; use DataChannelEventObserverInterface for that. An embedder
// that wants both can install both at construction time.
class RTC_EXPORT PeerConnectionTracerInterface {
public:
virtual ~PeerConnectionTracerInterface() = default;
// CreateOffer was called by the application; OnCreateOfferSuccess /
// OnCreateOfferFailure fires when the operation resolves. The SDP type
// is recoverable via description->GetType() (returns webrtc::SdpType).
virtual void OnCreateOffer(
const PeerConnectionInterface::RTCOfferAnswerOptions& options) = 0;
virtual void OnCreateOfferSuccess(
const SessionDescriptionInterface* description) = 0;
virtual void OnCreateOfferFailure(const RTCError& error) = 0;
// CreateAnswer was called by the application.
virtual void OnCreateAnswer(
const PeerConnectionInterface::RTCOfferAnswerOptions& options) = 0;
virtual void OnCreateAnswerSuccess(
const SessionDescriptionInterface* description) = 0;
virtual void OnCreateAnswerFailure(const RTCError& error) = 0;
// SetLocalDescription was called. `description` is null for the no-arg
// overload, where the PC produces the SDP internally; success then
// carries the description that was applied.
virtual void OnSetLocalDescription(
const SessionDescriptionInterface* description) = 0;
virtual void OnSetLocalDescriptionSuccess(
const SessionDescriptionInterface* description) = 0;
virtual void OnSetLocalDescriptionFailure(const RTCError& error) = 0;
// SetRemoteDescription was called. Success carries no payload because
// the description was supplied by the caller.
virtual void OnSetRemoteDescription(
const SessionDescriptionInterface* description) = 0;
virtual void OnSetRemoteDescriptionSuccess() = 0;
virtual void OnSetRemoteDescriptionFailure(const RTCError& error) = 0;
// SetConfiguration was called. Fired only after configuration has been
// validated and applied successfully.
virtual void OnSetConfiguration(
const PeerConnectionInterface::RTCConfiguration& configuration) = 0;
// PeerConnection::Close was called.
virtual void OnClose() = 0;
// The local ICE agent gathered a candidate that will be signaled to
// the remote peer (mirrors the PeerConnectionObserver::OnIceCandidate
// callback).
virtual void OnIceCandidate(const IceCandidate& candidate) = 0;
// The application called PeerConnection::AddIceCandidate with a
// candidate received from the remote peer over signaling. `succeeded`
// indicates whether the candidate was accepted.
virtual void OnAddIceCandidate(const IceCandidate& candidate,
bool succeeded) = 0;
// Local ICE candidate gathering produced an error.
virtual void OnIceCandidateError(absl::string_view address,
int port,
absl::string_view url,
int error_code,
absl::string_view error_text) = 0;
// A data channel was created locally via PeerConnection::CreateDataChannel.
// `id` is the stream id the application preassigned, if any. It is passed
// separately because DataChannelInterface::id() is network-thread bound and
// would block the signaling thread.
virtual void OnCreateDataChannel(const DataChannelInterface& channel,
std::optional<int> id) = 0;
// A peer-initiated data channel was surfaced via the OnDataChannel observer
// callback. `id` is the stream id its OPEN message arrived on.
virtual void OnDataChannel(const DataChannelInterface& channel,
std::optional<int> id) = 0;
// State-change events. These are fired in addition to (not in place of)
// the equivalent PeerConnectionObserver callbacks.
virtual void OnSignalingStateChanged(
PeerConnectionInterface::SignalingState state) = 0;
// Note: this is OnStandardizedIceConnectionChange(), i.e. the state the
// specification exposes not the legacy OnIceConnectionChange() one.
virtual void OnIceConnectionStateChanged(
PeerConnectionInterface::IceConnectionState state) = 0;
virtual void OnConnectionStateChanged(
PeerConnectionInterface::PeerConnectionState state) = 0;
virtual void OnIceGatheringStateChanged(
PeerConnectionInterface::IceGatheringState state) = 0;
// Gated by ShouldFireNegotiationNeededEvent().
virtual void OnNegotiationNeededEvent() = 0;
};
} // namespace webrtc
#endif // API_PEER_CONNECTION_TRACER_INTERFACE_H_