#ifndef NET_NQE_SOCKET_WATCHER_H_
#define NET_NQE_SOCKET_WATCHER_H_
#include <optional>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/sequence_checker.h"
#include "base/time/time.h"
#include "net/base/net_export.h"
#include "net/nqe/network_quality_estimator_util.h"
#include "net/socket/socket_performance_watcher.h"
#include "net/socket/socket_performance_watcher_factory.h"
namespace base {
class SingleThreadTaskRunner;
class TickClock;
class TimeDelta;
}
namespace net {
class IPAddress;
namespace {
typedef base::RepeatingCallback<void(
SocketPerformanceWatcherFactory::Protocol protocol,
const base::TimeDelta& rtt,
const std::optional<nqe::internal::IPHash>& host)>
OnUpdatedRTTAvailableCallback;
typedef base::RepeatingCallback<bool(base::TimeTicks)> ShouldNotifyRTTCallback;
}
namespace nqe::internal {
class NET_EXPORT_PRIVATE SocketWatcher : public SocketPerformanceWatcher {
public:
SocketWatcher(SocketPerformanceWatcherFactory::Protocol protocol,
const IPAddress& address,
base::TimeDelta min_notification_interval,
bool allow_rtt_private_address,
scoped_refptr<base::SingleThreadTaskRunner> task_runner,
OnUpdatedRTTAvailableCallback updated_rtt_observation_callback,
ShouldNotifyRTTCallback should_notify_rtt_callback,
const base::TickClock* tick_clock);
SocketWatcher(const SocketWatcher&) = delete;
SocketWatcher& operator=(const SocketWatcher&) = delete;
~SocketWatcher() override;
bool ShouldNotifyUpdatedRTT() const override;
void OnUpdatedRTTAvailable(const base::TimeDelta& rtt) override;
void OnConnectionChanged() override;
private:
const SocketPerformanceWatcherFactory::Protocol protocol_;
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
OnUpdatedRTTAvailableCallback updated_rtt_observation_callback_;
ShouldNotifyRTTCallback should_notify_rtt_callback_;
const base::TimeDelta rtt_notifications_minimum_interval_;
const bool allow_rtt_private_address_;
const bool run_rtt_callback_;
base::TimeTicks last_rtt_notification_;
raw_ptr<const base::TickClock> tick_clock_;
SEQUENCE_CHECKER(sequence_checker_);
bool first_quic_rtt_notification_received_ = false;
const std::optional<IPHash> host_;
};
}
}
#endif