blob: e49f6c7fce36580e3dd8335f5522c8ce70e94684 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "remoting/signaling/corp_message_channel_strategy.h"
#include <utility>
#include <variant>
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/functional/callback_helpers.h"
#include "base/logging.h"
#include "remoting/base/http_status.h"
#include "remoting/base/internal_headers.h"
#include "remoting/base/scoped_protobuf_http_request.h"
#include "remoting/proto/messaging_service.h"
#include "third_party/abseil-cpp/absl/functional/overload.h"
using remoting::internal::ChannelActiveStruct;
using remoting::internal::ChannelOpenStruct;
using remoting::internal::ReceiveClientMessagesResponseStruct;
using remoting::internal::SimpleMessageStruct;
namespace remoting {
CorpMessageChannelStrategy::CorpMessageChannelStrategy() = default;
CorpMessageChannelStrategy::~CorpMessageChannelStrategy() = default;
void CorpMessageChannelStrategy::Initialize(
const StreamOpener& stream_opener,
const MessageCallback& on_incoming_msg) {
DCHECK(stream_opener);
DCHECK(on_incoming_msg);
stream_opener_ = stream_opener;
on_incoming_msg_ = on_incoming_msg;
// TODO: joedow - The current message channel impl expects to have an
// inactivity timeout available as soon as the channel is created because that
// is how FTL messaging works. Since the Corp inactivity timeout is provided
// by the server, we'll need to update the MessageChannel class to handle that
// case. For now, set a generous initial timeout which will be overwritten
// when the channel open message is received.
inactivity_timeout_ = base::Seconds(60);
}
void CorpMessageChannelStrategy::OnReceiveMessagesResponse(
std::unique_ptr<ReceiveClientMessagesResponseStruct> response) {
std::visit(absl::Overload(
[this](const ChannelOpenStruct& channel_open_message) {
VLOG(0) << "Received channel open";
inactivity_timeout_ =
channel_open_message.inactivity_timeout;
},
[this](const ChannelActiveStruct& channel_active_message) {
VLOG(0) << "Received channel active";
on_channel_active_.Run();
},
[this](const SimpleMessageStruct& simple_message) {
VLOG(0) << "Received simple message";
on_incoming_msg_.Run(simple_message);
}),
response->message);
}
std::unique_ptr<ScopedProtobufHttpRequest>
CorpMessageChannelStrategy::CreateChannel(
base::OnceClosure on_channel_ready,
ChannelClosedCallback on_channel_closed) {
return stream_opener_.Run(
std::move(on_channel_ready),
base::BindRepeating(
&CorpMessageChannelStrategy::OnReceiveMessagesResponse,
weak_factory_.GetWeakPtr()),
std::move(on_channel_closed));
}
base::TimeDelta CorpMessageChannelStrategy::GetInactivityTimeout() const {
return *inactivity_timeout_;
}
void CorpMessageChannelStrategy::set_on_channel_active(
base::RepeatingClosure on_channel_active) {
on_channel_active_ = std::move(on_channel_active);
}
} // namespace remoting