blob: 35dcce5e507b710e416602ae0066838aabea265f [file]
// Copyright 2023 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "quiche/quic/moqt/tools/moqt_client.h"
#include <memory>
#include <string>
#include <utility>
#include "absl/status/status.h"
#include "absl/types/span.h"
#include "quiche/quic/core/crypto/proof_verifier.h"
#include "quiche/quic/core/io/quic_event_loop.h"
#include "quiche/quic/core/quic_server_id.h"
#include "quiche/quic/core/quic_types.h"
#include "quiche/quic/moqt/moqt_messages.h"
#include "quiche/quic/moqt/moqt_quic_config.h"
#include "quiche/quic/moqt/moqt_session.h"
#include "quiche/quic/moqt/moqt_session_callbacks.h"
#include "quiche/quic/moqt/moqt_session_interface.h"
#include "quiche/quic/platform/api/quic_socket_address.h"
#include "quiche/quic/tools/quic_name_lookup.h"
#include "quiche/quic/tools/web_transport_only_client.h"
#include "quiche/web_transport/web_transport.h"
namespace moqt {
MoqtClient::MoqtClient(quic::QuicSocketAddress peer_address,
const quic::QuicServerId& server_id,
std::unique_ptr<quic::ProofVerifier> proof_verifier,
quic::QuicEventLoop* event_loop,
MoqtSessionParameters parameters)
: client_(peer_address, server_id, GetMoqtSupportedQuicVersions(),
GenerateQuicConfig(), event_loop, nullptr,
std::move(proof_verifier), nullptr),
parameters_(parameters) {
TuneQuicConfig(*client_.config());
parameters_.perspective = quic::Perspective::IS_CLIENT;
}
void MoqtClient::Connect(std::string path, MoqtSessionCallbacks callbacks) {
absl::Status status = ConnectInner(std::move(path), callbacks);
if (!status.ok()) {
std::move(callbacks.session_terminated_callback)(status.message());
}
}
absl::Status MoqtClient::ConnectInner(std::string path,
MoqtSessionCallbacks& callbacks) {
const std::string version = std::string(kDefaultMoqtVersion);
MoqtSessionDeletedCallback deleted_callback =
std::move(callbacks.session_deleted_callback);
callbacks.session_deleted_callback =
[this, old = std::move(deleted_callback)]() mutable {
session_ = nullptr;
std::move(old)();
};
return client_.ConnectSync(
path,
[&](webtransport::Session* session) {
auto moqt_session =
std::make_unique<MoqtSession>(session, parameters_,
client_.default_network_helper()
->event_loop()
->CreateAlarmFactory(),
std::move(callbacks));
session_ = moqt_session.get();
return moqt_session;
},
absl::MakeSpan(&version, 1));
}
} // namespace moqt