blob: 3cf965e5aaa0f069183ec7f07d02b08d6fd4efee [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef REMOTING_SIGNALING_FTL_MESSAGE_RECEPTION_CHANNEL_H_
#define REMOTING_SIGNALING_FTL_MESSAGE_RECEPTION_CHANNEL_H_
#include <list>
#include <memory>
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "net/base/backoff_entry.h"
#include "remoting/signaling/message_reception_channel.h"
#include "remoting/signaling/signaling_tracker.h"
namespace remoting {
// Handles the lifetime and validity of the messaging stream used for FTL.
class FtlMessageReceptionChannel final : public MessageReceptionChannel {
public:
static constexpr base::TimeDelta kPongTimeout = base::Seconds(15);
// |signaling_tracker| is nullable.
explicit FtlMessageReceptionChannel(SignalingTracker* signaling_tracker);
FtlMessageReceptionChannel(const FtlMessageReceptionChannel&) = delete;
FtlMessageReceptionChannel& operator=(const FtlMessageReceptionChannel&) =
delete;
~FtlMessageReceptionChannel() override;
// MessageReceptionChannel implementations.
void Initialize(const StreamOpener& stream_opener,
const MessageCallback& on_incoming_msg) override;
void StartReceivingMessages(base::OnceClosure on_ready,
DoneCallback on_closed) override;
void StopReceivingMessages() override;
bool IsReceivingMessages() const override;
const net::BackoffEntry& GetReconnectRetryBackoffEntryForTesting() const;
private:
enum class State {
// TODO(yuweih): Evaluate if this class needs to be reusable.
STOPPED,
// StartReceivingMessages() is called but the channel hasn't received a
// signal from the server yet.
STARTING,
// Stream is started, or is dropped but being retried.
STARTED,
};
void OnReceiveMessagesStreamReady();
void OnReceiveMessagesStreamClosed(const ProtobufHttpStatus& status);
void OnMessageReceived(
std::unique_ptr<ftl::ReceiveMessagesResponse> response);
void RunStreamReadyCallbacks();
void RunStreamClosedCallbacks(const ProtobufHttpStatus& status);
void RetryStartReceivingMessagesWithBackoff();
void RetryStartReceivingMessages();
void StartReceivingMessagesInternal();
void StopReceivingMessagesInternal();
void BeginStreamTimers();
void OnPongTimeout();
StreamOpener stream_opener_;
MessageCallback on_incoming_msg_;
std::unique_ptr<ScopedProtobufHttpRequest> receive_messages_stream_;
std::list<base::OnceClosure> stream_ready_callbacks_;
std::list<DoneCallback> stream_closed_callbacks_;
State state_ = State::STOPPED;
net::BackoffEntry reconnect_retry_backoff_;
base::OneShotTimer reconnect_retry_timer_;
std::unique_ptr<base::DelayTimer> stream_pong_timer_;
raw_ptr<SignalingTracker> signaling_tracker_; // nullable.
base::WeakPtrFactory<FtlMessageReceptionChannel> weak_factory_{this};
};
} // namespace remoting
#endif // REMOTING_SIGNALING_FTL_MESSAGE_RECEPTION_CHANNEL_H_