| // Copyright (c) 2026 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_MOQT_ERROR_H_ |
| #define QUICHE_QUIC_MOQT_MOQT_ERROR_H_ |
| |
| #include <cstdint> |
| #include <optional> |
| #include <string> |
| |
| #include "absl/status/status.h" |
| #include "absl/strings/string_view.h" |
| #include "quiche/quic/core/quic_time.h" |
| #include "quiche/common/platform/api/quiche_export.h" |
| #include "quiche/web_transport/web_transport.h" |
| |
| namespace moqt { |
| |
| // These are session errors sent in CONNECTION_CLOSE. |
| enum QUICHE_EXPORT MoqtError : uint64_t { |
| kNoError = 0x0, |
| kInternalError = 0x1, |
| kUnauthorized = 0x2, |
| kProtocolViolation = 0x3, |
| kInvalidRequestId = 0x4, |
| kDuplicateTrackAlias = 0x5, |
| kKeyValueFormattingError = 0x6, |
| kTooManyRequests = 0x7, |
| kInvalidPath = 0x8, |
| kMalformedPath = 0x9, |
| kGoawayTimeout = 0x10, |
| kControlMessageTimeout = 0x11, |
| kDataStreamTimeout = 0x12, |
| kAuthTokenCacheOverflow = 0x13, |
| kDuplicateAuthTokenAlias = 0x14, |
| kVersionNegotiationFailed = 0x15, |
| kMalformedAuthToken = 0x16, |
| kUnknownAuthTokenAlias = 0x17, |
| kExpiredAuthToken = 0x18, |
| kInvalidAuthority = 0x19, |
| kMalformedAuthority = 0x1a, |
| }; |
| |
| // Utility functions to attach MoqtError to an absl::Status. |
| std::optional<MoqtError> GetMoqtErrorForStatus(const absl::Status& status); |
| void SetMoqtErrorForStatus(absl::Status& status, MoqtError error); |
| absl::Status MoqtErrorStatusWithCode(absl::string_view data, MoqtError error); |
| |
| // Error codes used by MoQT to reset streams. |
| inline constexpr webtransport::StreamErrorCode kResetCodeInternalError = 0x00; |
| inline constexpr webtransport::StreamErrorCode kResetCodeCancelled = 0x01; |
| inline constexpr webtransport::StreamErrorCode kResetCodeDeliveryTimeout = 0x02; |
| inline constexpr webtransport::StreamErrorCode kResetCodeSessionClosed = 0x03; |
| inline constexpr webtransport::StreamErrorCode kResetCodeUnknownObjectStatus = |
| 0x04; |
| inline constexpr webtransport::StreamErrorCode kResetCodeMalformedTrack = 0x12; |
| // Proposed in a PR post draft-16. |
| inline constexpr webtransport::StreamErrorCode kResetCodeTooFarBehind = 0x05; |
| |
| // Used for SUBSCRIBE_ERROR, PUBLISH_NAMESPACE_ERROR, PUBLISH_NAMESPACE_CANCEL, |
| // SUBSCRIBE_NAMESPACE_ERROR, and FETCH_ERROR. |
| enum class QUICHE_EXPORT RequestErrorCode : uint64_t { |
| kInternalError = 0x0, |
| kUnauthorized = 0x1, |
| kTimeout = 0x2, |
| kNotSupported = 0x3, |
| kMalformedAuthToken = 0x4, |
| kExpiredAuthToken = 0x5, |
| kDoesNotExist = 0x10, |
| kInvalidRange = 0x11, |
| kMalformedTrack = 0x12, |
| kDuplicateSubscription = 0x19, |
| kUninterested = 0x20, |
| kNamespacePrefixUnknown = 0x21, |
| kPrefixOverlap = 0x30, |
| kInvalidJoiningRequestId = 0x32, |
| }; |
| |
| enum class QUICHE_EXPORT PublishDoneCode : uint64_t { |
| kInternalError = 0x0, |
| kUnauthorized = 0x1, |
| kTrackEnded = 0x2, |
| kSubscriptionEnded = 0x3, |
| kGoingAway = 0x4, |
| kExpired = 0x5, |
| kTooFarBehind = 0x6, |
| kUpdateFailed = 0x8, |
| kMalformedTrack = 0x12, |
| }; |
| |
| struct MoqtRequestErrorInfo { |
| RequestErrorCode error_code; |
| std::optional<quic::QuicTimeDelta> retry_interval; |
| std::string reason_phrase; |
| bool operator==(const MoqtRequestErrorInfo& other) const = default; |
| }; |
| |
| RequestErrorCode StatusToRequestErrorCode(absl::Status status); |
| absl::StatusCode RequestErrorCodeToStatusCode(RequestErrorCode error_code); |
| absl::Status RequestErrorCodeToStatus(RequestErrorCode error_code, |
| absl::string_view reason_phrase); |
| |
| absl::Status MoqtStreamErrorToStatus(webtransport::StreamErrorCode error_code, |
| absl::string_view reason_phrase); |
| |
| } // namespace moqt |
| |
| #endif // QUICHE_QUIC_MOQT_MOQT_ERROR_H_ |