| // 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. | |
| #ifndef QUICHE_QUIC_MOQT_TOOLS_MOQT_SERVER_H_ | |
| #define QUICHE_QUIC_MOQT_TOOLS_MOQT_SERVER_H_ | |
| #include <memory> | |
| #include "absl/status/status.h" | |
| #include "absl/status/statusor.h" | |
| #include "absl/strings/string_view.h" | |
| #include "quiche/quic/core/crypto/proof_source.h" | |
| #include "quiche/quic/core/crypto/quic_crypto_server_config.h" | |
| #include "quiche/quic/core/deterministic_connection_id_generator.h" | |
| #include "quiche/quic/core/http/web_transport_only_dispatcher.h" | |
| #include "quiche/quic/core/io/quic_event_loop.h" | |
| #include "quiche/quic/core/io/quic_server_io_harness.h" | |
| #include "quiche/quic/core/io/socket.h" | |
| #include "quiche/quic/core/quic_config.h" | |
| #include "quiche/quic/core/quic_version_manager.h" | |
| #include "quiche/quic/moqt/moqt_session.h" | |
| #include "quiche/quic/moqt/moqt_session_interface.h" | |
| #include "quiche/quic/platform/api/quic_socket_address.h" | |
| #include "quiche/common/platform/api/quiche_export.h" | |
| #include "quiche/common/quiche_callbacks.h" | |
| namespace moqt { | |
| namespace test { | |
| class MoqtServerPeer; | |
| } // namespace test | |
| // A callback to configure an already created MoQT session. | |
| using MoqtConfigureSessionCallback = | |
| quiche::SingleUseCallback<void(MoqtSession* session)>; | |
| // A callback to provide MoQT handler based on the path in the request. | |
| using MoqtIncomingSessionCallback = | |
| quiche::MultiUseCallback<absl::StatusOr<MoqtConfigureSessionCallback>( | |
| absl::string_view path)>; | |
| // A simple MoQT server. | |
| class QUICHE_EXPORT MoqtServer { | |
| public: | |
| explicit MoqtServer( | |
| std::unique_ptr<quic::ProofSource> proof_source, | |
| MoqtIncomingSessionCallback callback, | |
| MoqtSessionParameters session_parameters = MoqtSessionParameters()); | |
| MoqtServer(const MoqtServer&) = delete; | |
| MoqtServer(MoqtServer&&) = delete; | |
| MoqtServer& operator=(const MoqtServer&) = delete; | |
| MoqtServer& operator=(MoqtServer&&) = delete; | |
| absl::Status CreateUDPSocketAndListen(const quic::QuicSocketAddress& address); | |
| void WaitForEvents(); | |
| void HandleEventsForever(); | |
| quic::QuicEventLoop* event_loop() { return event_loop_.get(); } | |
| int port() { return io_->local_address().port(); } | |
| private: | |
| friend class test::MoqtServerPeer; | |
| quic::QuicConfig config_; | |
| quic::QuicCryptoServerConfig crypto_config_; | |
| quic::QuicVersionManager version_manager_; | |
| quic::DeterministicConnectionIdGenerator connection_id_generator_; | |
| std::unique_ptr<quic::QuicEventLoop> event_loop_; | |
| quic::WebTransportOnlyDispatcher dispatcher_; | |
| MoqtSessionParameters session_parameters_; | |
| quic::OwnedSocketFd fd_; | |
| std::unique_ptr<quic::QuicServerIoHarness> io_; | |
| }; | |
| } // namespace moqt | |
| #endif // QUICHE_QUIC_MOQT_TOOLS_MOQT_SERVER_H_ |