Rename ANNOUNCE* to PUBLISH_NAMESPACE* (draft-14)
PiperOrigin-RevId: 805409434
diff --git a/quiche/quic/moqt/moqt_framer.cc b/quiche/quic/moqt/moqt_framer.cc
index 2858390..4717cf2 100644
--- a/quiche/quic/moqt/moqt_framer.cc
+++ b/quiche/quic/moqt/moqt_framer.cc
@@ -531,46 +531,46 @@
WireBoolean(message.forward), WireKeyValuePairList(parameters));
}
-quiche::QuicheBuffer MoqtFramer::SerializeAnnounce(
- const MoqtAnnounce& message) {
+quiche::QuicheBuffer MoqtFramer::SerializePublishNamespace(
+ const MoqtPublishNamespace& message) {
KeyValuePairList parameters;
VersionSpecificParametersToKeyValuePairList(message.parameters, parameters);
if (!ValidateVersionSpecificParameters(parameters,
- MoqtMessageType::kAnnounce)) {
+ MoqtMessageType::kPublishNamespace)) {
QUICHE_BUG(QUICHE_BUG_invalid_parameters)
<< "Serializing invalid MoQT parameters";
return quiche::QuicheBuffer();
}
- return SerializeControlMessage(MoqtMessageType::kAnnounce,
+ return SerializeControlMessage(MoqtMessageType::kPublishNamespace,
WireVarInt62(message.request_id),
WireTrackNamespace(message.track_namespace),
WireKeyValuePairList(parameters));
}
-quiche::QuicheBuffer MoqtFramer::SerializeAnnounceOk(
- const MoqtAnnounceOk& message) {
- return SerializeControlMessage(MoqtMessageType::kAnnounceOk,
+quiche::QuicheBuffer MoqtFramer::SerializePublishNamespaceOk(
+ const MoqtPublishNamespaceOk& message) {
+ return SerializeControlMessage(MoqtMessageType::kPublishNamespaceOk,
WireVarInt62(message.request_id));
}
-quiche::QuicheBuffer MoqtFramer::SerializeAnnounceError(
- const MoqtAnnounceError& message) {
+quiche::QuicheBuffer MoqtFramer::SerializePublishNamespaceError(
+ const MoqtPublishNamespaceError& message) {
return SerializeControlMessage(
- MoqtMessageType::kAnnounceError, WireVarInt62(message.request_id),
+ MoqtMessageType::kPublishNamespaceError, WireVarInt62(message.request_id),
WireVarInt62(message.error_code),
WireStringWithVarInt62Length(message.error_reason));
}
-quiche::QuicheBuffer MoqtFramer::SerializeUnannounce(
- const MoqtUnannounce& message) {
- return SerializeControlMessage(MoqtMessageType::kUnannounce,
+quiche::QuicheBuffer MoqtFramer::SerializePublishNamespaceDone(
+ const MoqtPublishNamespaceDone& message) {
+ return SerializeControlMessage(MoqtMessageType::kPublishNamespaceDone,
WireTrackNamespace(message.track_namespace));
}
-quiche::QuicheBuffer MoqtFramer::SerializeAnnounceCancel(
- const MoqtAnnounceCancel& message) {
+quiche::QuicheBuffer MoqtFramer::SerializePublishNamespaceCancel(
+ const MoqtPublishNamespaceCancel& message) {
return SerializeControlMessage(
- MoqtMessageType::kAnnounceCancel,
+ MoqtMessageType::kPublishNamespaceCancel,
WireTrackNamespace(message.track_namespace),
WireVarInt62(message.error_code),
WireStringWithVarInt62Length(message.error_reason));
diff --git a/quiche/quic/moqt/moqt_framer.h b/quiche/quic/moqt/moqt_framer.h
index 0168758..e5a4a52 100644
--- a/quiche/quic/moqt/moqt_framer.h
+++ b/quiche/quic/moqt/moqt_framer.h
@@ -56,12 +56,16 @@
quiche::QuicheBuffer SerializePublishDone(const MoqtPublishDone& message);
quiche::QuicheBuffer SerializeSubscribeUpdate(
const MoqtSubscribeUpdate& message);
- quiche::QuicheBuffer SerializeAnnounce(const MoqtAnnounce& message);
- quiche::QuicheBuffer SerializeAnnounceOk(const MoqtAnnounceOk& message);
- quiche::QuicheBuffer SerializeAnnounceError(const MoqtAnnounceError& message);
- quiche::QuicheBuffer SerializeUnannounce(const MoqtUnannounce& message);
- quiche::QuicheBuffer SerializeAnnounceCancel(
- const MoqtAnnounceCancel& message);
+ quiche::QuicheBuffer SerializePublishNamespace(
+ const MoqtPublishNamespace& message);
+ quiche::QuicheBuffer SerializePublishNamespaceOk(
+ const MoqtPublishNamespaceOk& message);
+ quiche::QuicheBuffer SerializePublishNamespaceError(
+ const MoqtPublishNamespaceError& message);
+ quiche::QuicheBuffer SerializePublishNamespaceDone(
+ const MoqtPublishNamespaceDone& message);
+ quiche::QuicheBuffer SerializePublishNamespaceCancel(
+ const MoqtPublishNamespaceCancel& message);
quiche::QuicheBuffer SerializeTrackStatus(const MoqtTrackStatus& message);
quiche::QuicheBuffer SerializeTrackStatusOk(const MoqtTrackStatusOk& message);
quiche::QuicheBuffer SerializeTrackStatusError(
diff --git a/quiche/quic/moqt/moqt_framer_test.cc b/quiche/quic/moqt/moqt_framer_test.cc
index a63dfb3..47c2fe2 100644
--- a/quiche/quic/moqt/moqt_framer_test.cc
+++ b/quiche/quic/moqt/moqt_framer_test.cc
@@ -39,11 +39,11 @@
MoqtMessageType::kSubscribeError,
MoqtMessageType::kUnsubscribe,
MoqtMessageType::kPublishDone,
- MoqtMessageType::kAnnounce,
- MoqtMessageType::kAnnounceOk,
- MoqtMessageType::kAnnounceError,
- MoqtMessageType::kUnannounce,
- MoqtMessageType::kAnnounceCancel,
+ MoqtMessageType::kPublishNamespace,
+ MoqtMessageType::kPublishNamespaceOk,
+ MoqtMessageType::kPublishNamespaceError,
+ MoqtMessageType::kPublishNamespaceDone,
+ MoqtMessageType::kPublishNamespaceCancel,
MoqtMessageType::kTrackStatus,
MoqtMessageType::kTrackStatusOk,
MoqtMessageType::kTrackStatusError,
@@ -144,25 +144,25 @@
auto data = std::get<MoqtPublishDone>(structured_data);
return framer_.SerializePublishDone(data);
}
- case MoqtMessageType::kAnnounce: {
- auto data = std::get<MoqtAnnounce>(structured_data);
- return framer_.SerializeAnnounce(data);
+ case MoqtMessageType::kPublishNamespace: {
+ auto data = std::get<MoqtPublishNamespace>(structured_data);
+ return framer_.SerializePublishNamespace(data);
}
- case moqt::MoqtMessageType::kAnnounceOk: {
- auto data = std::get<MoqtAnnounceOk>(structured_data);
- return framer_.SerializeAnnounceOk(data);
+ case moqt::MoqtMessageType::kPublishNamespaceOk: {
+ auto data = std::get<MoqtPublishNamespaceOk>(structured_data);
+ return framer_.SerializePublishNamespaceOk(data);
}
- case moqt::MoqtMessageType::kAnnounceError: {
- auto data = std::get<MoqtAnnounceError>(structured_data);
- return framer_.SerializeAnnounceError(data);
+ case moqt::MoqtMessageType::kPublishNamespaceError: {
+ auto data = std::get<MoqtPublishNamespaceError>(structured_data);
+ return framer_.SerializePublishNamespaceError(data);
}
- case MoqtMessageType::kUnannounce: {
- auto data = std::get<MoqtUnannounce>(structured_data);
- return framer_.SerializeUnannounce(data);
+ case MoqtMessageType::kPublishNamespaceDone: {
+ auto data = std::get<MoqtPublishNamespaceDone>(structured_data);
+ return framer_.SerializePublishNamespaceDone(data);
}
- case moqt::MoqtMessageType::kAnnounceCancel: {
- auto data = std::get<MoqtAnnounceCancel>(structured_data);
- return framer_.SerializeAnnounceCancel(data);
+ case moqt::MoqtMessageType::kPublishNamespaceCancel: {
+ auto data = std::get<MoqtPublishNamespaceCancel>(structured_data);
+ return framer_.SerializePublishNamespaceCancel(data);
}
case moqt::MoqtMessageType::kTrackStatus: {
auto data = std::get<MoqtTrackStatus>(structured_data);
diff --git a/quiche/quic/moqt/moqt_integration_test.cc b/quiche/quic/moqt/moqt_integration_test.cc
index 6eeb973..5c232f9 100644
--- a/quiche/quic/moqt/moqt_integration_test.cc
+++ b/quiche/quic/moqt/moqt_integration_test.cc
@@ -144,23 +144,24 @@
EXPECT_TRUE(success);
}
-TEST_F(MoqtIntegrationTest, AnnounceSuccessThenUnannounce) {
+TEST_F(MoqtIntegrationTest, PublishNamespaceSuccessThenPublishNamespaceDone) {
EstablishSession();
auto parameters = std::make_optional<VersionSpecificParameters>(
AuthTokenType::kOutOfBand, "foo");
- EXPECT_CALL(server_callbacks_.incoming_announce_callback,
+ EXPECT_CALL(server_callbacks_.incoming_publish_namespace_callback,
Call(TrackNamespace{"foo"}, parameters))
.WillOnce(Return(std::nullopt));
testing::MockFunction<void(
TrackNamespace track_namespace,
- std::optional<MoqtAnnounceErrorReason> error_message)>
- announce_callback;
- client_->session()->Announce(TrackNamespace{"foo"},
- announce_callback.AsStdFunction(), *parameters);
+ std::optional<MoqtPublishNamespaceErrorReason> error_message)>
+ publish_namespace_callback;
+ client_->session()->PublishNamespace(
+ TrackNamespace{"foo"}, publish_namespace_callback.AsStdFunction(),
+ *parameters);
bool matches = false;
- EXPECT_CALL(announce_callback, Call(_, _))
+ EXPECT_CALL(publish_namespace_callback, Call(_, _))
.WillOnce([&](TrackNamespace track_namespace,
- std::optional<MoqtAnnounceErrorReason> error) {
+ std::optional<MoqtPublishNamespaceErrorReason> error) {
matches = true;
EXPECT_EQ(track_namespace, TrackNamespace{"foo"});
EXPECT_FALSE(error.has_value());
@@ -169,7 +170,7 @@
test_harness_.RunUntilWithDefaultTimeout([&]() { return matches; });
EXPECT_TRUE(success);
matches = false;
- EXPECT_CALL(server_callbacks_.incoming_announce_callback, Call(_, _))
+ EXPECT_CALL(server_callbacks_.incoming_publish_namespace_callback, Call(_, _))
.WillOnce([&](TrackNamespace name,
std::optional<VersionSpecificParameters> parameters) {
matches = true;
@@ -177,28 +178,29 @@
EXPECT_FALSE(parameters.has_value());
return std::nullopt;
});
- client_->session()->Unannounce(TrackNamespace{"foo"});
+ client_->session()->PublishNamespaceDone(TrackNamespace{"foo"});
success = test_harness_.RunUntilWithDefaultTimeout([&]() { return matches; });
EXPECT_TRUE(success);
}
-TEST_F(MoqtIntegrationTest, AnnounceSuccessThenCancel) {
+TEST_F(MoqtIntegrationTest, PublishNamespaceSuccessThenCancel) {
EstablishSession();
auto parameters = std::make_optional<VersionSpecificParameters>(
AuthTokenType::kOutOfBand, "foo");
- EXPECT_CALL(server_callbacks_.incoming_announce_callback,
+ EXPECT_CALL(server_callbacks_.incoming_publish_namespace_callback,
Call(TrackNamespace{"foo"}, parameters))
.WillOnce(Return(std::nullopt));
testing::MockFunction<void(
TrackNamespace track_namespace,
- std::optional<MoqtAnnounceErrorReason> error_message)>
- announce_callback;
- client_->session()->Announce(TrackNamespace{"foo"},
- announce_callback.AsStdFunction(), *parameters);
+ std::optional<MoqtPublishNamespaceErrorReason> error_message)>
+ publish_namespace_callback;
+ client_->session()->PublishNamespace(
+ TrackNamespace{"foo"}, publish_namespace_callback.AsStdFunction(),
+ *parameters);
bool matches = false;
- EXPECT_CALL(announce_callback, Call(_, _))
+ EXPECT_CALL(publish_namespace_callback, Call(_, _))
.WillOnce([&](TrackNamespace track_namespace,
- std::optional<MoqtAnnounceErrorReason> error) {
+ std::optional<MoqtPublishNamespaceErrorReason> error) {
matches = true;
EXPECT_EQ(track_namespace, TrackNamespace{"foo"});
EXPECT_FALSE(error.has_value());
@@ -207,40 +209,41 @@
test_harness_.RunUntilWithDefaultTimeout([&]() { return matches; });
EXPECT_TRUE(success);
matches = false;
- EXPECT_CALL(announce_callback, Call(_, _))
+ EXPECT_CALL(publish_namespace_callback, Call(_, _))
.WillOnce([&](TrackNamespace track_namespace,
- std::optional<MoqtAnnounceErrorReason> error) {
+ std::optional<MoqtPublishNamespaceErrorReason> error) {
matches = true;
EXPECT_EQ(track_namespace, TrackNamespace{"foo"});
ASSERT_TRUE(error.has_value());
EXPECT_EQ(error->error_code, RequestErrorCode::kInternalError);
EXPECT_EQ(error->reason_phrase, "internal error");
});
- server_->session()->CancelAnnounce(TrackNamespace{"foo"},
- RequestErrorCode::kInternalError,
- "internal error");
+ server_->session()->CancelPublishNamespace(TrackNamespace{"foo"},
+ RequestErrorCode::kInternalError,
+ "internal error");
success = test_harness_.RunUntilWithDefaultTimeout([&]() { return matches; });
EXPECT_TRUE(success);
}
-TEST_F(MoqtIntegrationTest, AnnounceSuccessSubscribeInResponse) {
+TEST_F(MoqtIntegrationTest, PublishNamespaceSuccessSubscribeInResponse) {
EstablishSession();
auto parameters = std::make_optional<VersionSpecificParameters>(
AuthTokenType::kOutOfBand, "foo");
- EXPECT_CALL(server_callbacks_.incoming_announce_callback,
+ EXPECT_CALL(server_callbacks_.incoming_publish_namespace_callback,
Call(TrackNamespace{"foo"}, parameters))
.WillOnce(Return(std::nullopt));
MockSubscribeRemoteTrackVisitor server_visitor;
testing::MockFunction<void(
TrackNamespace track_namespace,
- std::optional<MoqtAnnounceErrorReason> error_message)>
- announce_callback;
- client_->session()->Announce(TrackNamespace{"foo"},
- announce_callback.AsStdFunction(), *parameters);
+ std::optional<MoqtPublishNamespaceErrorReason> error_message)>
+ publish_namespace_callback;
+ client_->session()->PublishNamespace(
+ TrackNamespace{"foo"}, publish_namespace_callback.AsStdFunction(),
+ *parameters);
bool matches = false;
- EXPECT_CALL(announce_callback, Call(_, _))
+ EXPECT_CALL(publish_namespace_callback, Call(_, _))
.WillOnce([&](TrackNamespace track_namespace,
- std::optional<MoqtAnnounceErrorReason> error) {
+ std::optional<MoqtPublishNamespaceErrorReason> error) {
EXPECT_EQ(track_namespace, TrackNamespace{"foo"});
FullTrackName track_name(track_namespace, "/catalog");
EXPECT_FALSE(error.has_value());
@@ -255,22 +258,23 @@
EXPECT_TRUE(success);
}
-TEST_F(MoqtIntegrationTest, AnnounceSuccessSendDataInResponse) {
+TEST_F(MoqtIntegrationTest, PublishNamespaceSuccessSendDataInResponse) {
EstablishSession();
- // Set up the server to subscribe to "data" track for the namespace announce
- // it receives.
+ // Set up the server to subscribe to "data" track for the namespace
+ // publish_namespace it receives.
auto parameters = std::make_optional<VersionSpecificParameters>(
AuthTokenType::kOutOfBand, "foo");
MockSubscribeRemoteTrackVisitor server_visitor;
- EXPECT_CALL(server_callbacks_.incoming_announce_callback, Call(_, parameters))
+ EXPECT_CALL(server_callbacks_.incoming_publish_namespace_callback,
+ Call(_, parameters))
.WillOnce([&](const TrackNamespace& track_namespace,
std::optional<VersionSpecificParameters> /*parameters*/) {
FullTrackName track_name(track_namespace, "data");
server_->session()->SubscribeAbsolute(
track_name, /*start_group=*/0, /*start_object=*/0, &server_visitor,
VersionSpecificParameters());
- return std::optional<MoqtAnnounceErrorReason>();
+ return std::optional<MoqtPublishNamespaceErrorReason>();
});
auto queue = std::make_shared<MoqtOutgoingQueue>(
@@ -282,9 +286,9 @@
EXPECT_CALL(server_visitor, OnReply(_, _, _)).WillOnce([&]() {
received_subscribe_ok = true;
});
- client_->session()->Announce(
+ client_->session()->PublishNamespace(
TrackNamespace{"test"},
- [](TrackNamespace, std::optional<MoqtAnnounceErrorReason>) {},
+ [](TrackNamespace, std::optional<MoqtPublishNamespaceErrorReason>) {},
*parameters);
bool success = test_harness_.RunUntilWithDefaultTimeout(
[&]() { return received_subscribe_ok; });
@@ -474,19 +478,19 @@
EXPECT_EQ(expected, Location(99, 1));
}
-TEST_F(MoqtIntegrationTest, AnnounceFailure) {
+TEST_F(MoqtIntegrationTest, PublishNamespaceFailure) {
EstablishSession();
testing::MockFunction<void(
TrackNamespace track_namespace,
- std::optional<MoqtAnnounceErrorReason> error_message)>
- announce_callback;
- client_->session()->Announce(TrackNamespace{"foo"},
- announce_callback.AsStdFunction(),
- VersionSpecificParameters());
+ std::optional<MoqtPublishNamespaceErrorReason> error_message)>
+ publish_namespace_callback;
+ client_->session()->PublishNamespace(
+ TrackNamespace{"foo"}, publish_namespace_callback.AsStdFunction(),
+ VersionSpecificParameters());
bool matches = false;
- EXPECT_CALL(announce_callback, Call(_, _))
+ EXPECT_CALL(publish_namespace_callback, Call(_, _))
.WillOnce([&](TrackNamespace track_namespace,
- std::optional<MoqtAnnounceErrorReason> error) {
+ std::optional<MoqtPublishNamespaceErrorReason> error) {
matches = true;
EXPECT_EQ(track_namespace, TrackNamespace{"foo"});
ASSERT_TRUE(error.has_value());
diff --git a/quiche/quic/moqt/moqt_messages.cc b/quiche/quic/moqt/moqt_messages.cc
index c1f5dce..af3cba9 100644
--- a/quiche/quic/moqt/moqt_messages.cc
+++ b/quiche/quic/moqt/moqt_messages.cc
@@ -185,7 +185,7 @@
MoqtMessageType::kSubscribe,
MoqtMessageType::kSubscribeUpdate,
MoqtMessageType::kSubscribeNamespace,
- MoqtMessageType::kAnnounce,
+ MoqtMessageType::kPublishNamespace,
MoqtMessageType::kTrackStatus,
MoqtMessageType::kFetch};
const std::array<MoqtMessageType, 7> kAllowsDeliveryTimeout = {
@@ -241,22 +241,22 @@
return "SUBSCRIBE_DONE";
case MoqtMessageType::kSubscribeUpdate:
return "SUBSCRIBE_UPDATE";
- case MoqtMessageType::kAnnounceCancel:
- return "ANNOUNCE_CANCEL";
+ case MoqtMessageType::kPublishNamespaceCancel:
+ return "PUBLISH_NAMESPACE_CANCEL";
case MoqtMessageType::kTrackStatus:
return "TRACK_STATUS";
case MoqtMessageType::kTrackStatusOk:
return "TRACK_STATUS_OK";
case MoqtMessageType::kTrackStatusError:
return "TRACK_STATUS_ERROR";
- case MoqtMessageType::kAnnounce:
- return "ANNOUNCE";
- case MoqtMessageType::kAnnounceOk:
- return "ANNOUNCE_OK";
- case MoqtMessageType::kAnnounceError:
- return "ANNOUNCE_ERROR";
- case MoqtMessageType::kUnannounce:
- return "UNANNOUNCE";
+ case MoqtMessageType::kPublishNamespace:
+ return "PUBLISH_NAMESPACE";
+ case MoqtMessageType::kPublishNamespaceOk:
+ return "PUBLISH_NAMESPACE_OK";
+ case MoqtMessageType::kPublishNamespaceError:
+ return "PUBLISH_NAMESPACE_ERROR";
+ case MoqtMessageType::kPublishNamespaceDone:
+ return "PUBLISH_NAMESPACE_DONE";
case MoqtMessageType::kGoAway:
return "GOAWAY";
case MoqtMessageType::kSubscribeNamespace:
diff --git a/quiche/quic/moqt/moqt_messages.h b/quiche/quic/moqt/moqt_messages.h
index e208d06..2ab3320 100644
--- a/quiche/quic/moqt/moqt_messages.h
+++ b/quiche/quic/moqt/moqt_messages.h
@@ -254,13 +254,13 @@
kSubscribe = 0x03,
kSubscribeOk = 0x04,
kSubscribeError = 0x05,
- kAnnounce = 0x06,
- kAnnounceOk = 0x7,
- kAnnounceError = 0x08,
- kUnannounce = 0x09,
+ kPublishNamespace = 0x06,
+ kPublishNamespaceOk = 0x7,
+ kPublishNamespaceError = 0x08,
+ kPublishNamespaceDone = 0x09,
kUnsubscribe = 0x0a,
kPublishDone = 0x0b,
- kAnnounceCancel = 0x0c,
+ kPublishNamespaceCancel = 0x0c,
kTrackStatus = 0x0d,
kTrackStatusOk = 0x0e,
kTrackStatusError = 0x0f,
@@ -368,15 +368,16 @@
bool operator==(const VersionSpecificParameters& other) const = default;
};
-// Used for SUBSCRIBE_ERROR, ANNOUNCE_ERROR, ANNOUNCE_CANCEL,
+// 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,
- kTrackDoesNotExist = 0x4, // SUBSCRIBE_ERROR and FETCH_ERROR only.
- kUninterested = 0x4, // ANNOUNCE_ERROR and ANNOUNCE_CANCEL only.
+ kTrackDoesNotExist = 0x4, // SUBSCRIBE_ERROR and FETCH_ERROR only.
+ kUninterested =
+ 0x4, // PUBLISH_NAMESPACE_ERROR and PUBLISH_NAMESPACE_CANCEL only.
kNamespacePrefixUnknown = 0x4, // SUBSCRIBE_NAMESPACE_ERROR only.
kInvalidRange = 0x5, // SUBSCRIBE_ERROR and FETCH_ERROR only.
kNamespacePrefixOverlap = 0x5, // SUBSCRIBE_NAMESPACE_ERROR only.
@@ -394,7 +395,7 @@
};
// TODO(martinduke): These are deprecated. Replace them in the code.
using MoqtSubscribeErrorReason = MoqtRequestError;
-using MoqtAnnounceErrorReason = MoqtSubscribeErrorReason;
+using MoqtPublishNamespaceErrorReason = MoqtSubscribeErrorReason;
class TrackNamespace {
public:
@@ -730,27 +731,27 @@
VersionSpecificParameters parameters;
};
-struct QUICHE_EXPORT MoqtAnnounce {
+struct QUICHE_EXPORT MoqtPublishNamespace {
uint64_t request_id;
TrackNamespace track_namespace;
VersionSpecificParameters parameters;
};
-struct QUICHE_EXPORT MoqtAnnounceOk {
+struct QUICHE_EXPORT MoqtPublishNamespaceOk {
uint64_t request_id;
};
-struct QUICHE_EXPORT MoqtAnnounceError {
+struct QUICHE_EXPORT MoqtPublishNamespaceError {
uint64_t request_id;
RequestErrorCode error_code;
std::string error_reason;
};
-struct QUICHE_EXPORT MoqtUnannounce {
+struct QUICHE_EXPORT MoqtPublishNamespaceDone {
TrackNamespace track_namespace;
};
-struct QUICHE_EXPORT MoqtAnnounceCancel {
+struct QUICHE_EXPORT MoqtPublishNamespaceCancel {
TrackNamespace track_namespace;
RequestErrorCode error_code;
std::string error_reason;
diff --git a/quiche/quic/moqt/moqt_parser.cc b/quiche/quic/moqt/moqt_parser.cc
index afe7e5e..f40dfd2 100644
--- a/quiche/quic/moqt/moqt_parser.cc
+++ b/quiche/quic/moqt/moqt_parser.cc
@@ -238,20 +238,20 @@
case MoqtMessageType::kSubscribeUpdate:
bytes_read = ProcessSubscribeUpdate(reader);
break;
- case MoqtMessageType::kAnnounce:
- bytes_read = ProcessAnnounce(reader);
+ case MoqtMessageType::kPublishNamespace:
+ bytes_read = ProcessPublishNamespace(reader);
break;
- case MoqtMessageType::kAnnounceOk:
- bytes_read = ProcessAnnounceOk(reader);
+ case MoqtMessageType::kPublishNamespaceOk:
+ bytes_read = ProcessPublishNamespaceOk(reader);
break;
- case MoqtMessageType::kAnnounceError:
- bytes_read = ProcessAnnounceError(reader);
+ case MoqtMessageType::kPublishNamespaceError:
+ bytes_read = ProcessPublishNamespaceError(reader);
break;
- case MoqtMessageType::kUnannounce:
- bytes_read = ProcessUnannounce(reader);
+ case MoqtMessageType::kPublishNamespaceDone:
+ bytes_read = ProcessPublishNamespaceDone(reader);
break;
- case MoqtMessageType::kAnnounceCancel:
- bytes_read = ProcessAnnounceCancel(reader);
+ case MoqtMessageType::kPublishNamespaceCancel:
+ bytes_read = ProcessPublishNamespaceCancel(reader);
break;
case MoqtMessageType::kTrackStatus:
bytes_read = ProcessTrackStatus(reader);
@@ -581,10 +581,11 @@
return reader.PreviouslyReadPayload().length();
}
-size_t MoqtControlParser::ProcessAnnounce(quic::QuicDataReader& reader) {
- MoqtAnnounce announce;
- if (!reader.ReadVarInt62(&announce.request_id) ||
- !ReadTrackNamespace(reader, announce.track_namespace)) {
+size_t MoqtControlParser::ProcessPublishNamespace(
+ quic::QuicDataReader& reader) {
+ MoqtPublishNamespace publish_namespace;
+ if (!reader.ReadVarInt62(&publish_namespace.request_id) ||
+ !ReadTrackNamespace(reader, publish_namespace.track_namespace)) {
return 0;
}
KeyValuePairList parameters;
@@ -592,61 +593,67 @@
return 0;
}
if (!ValidateVersionSpecificParameters(parameters,
- MoqtMessageType::kAnnounce)) {
- ParseError("ANNOUNCE contains invalid parameters");
+ MoqtMessageType::kPublishNamespace)) {
+ ParseError("PUBLISH_NAMESPACE contains invalid parameters");
return 0;
}
- if (!KeyValuePairListToVersionSpecificParameters(parameters,
- announce.parameters)) {
+ if (!KeyValuePairListToVersionSpecificParameters(
+ parameters, publish_namespace.parameters)) {
return 0;
}
- visitor_.OnAnnounceMessage(announce);
+ visitor_.OnPublishNamespaceMessage(publish_namespace);
return reader.PreviouslyReadPayload().length();
}
-size_t MoqtControlParser::ProcessAnnounceOk(quic::QuicDataReader& reader) {
- MoqtAnnounceOk announce_ok;
- if (!reader.ReadVarInt62(&announce_ok.request_id)) {
+size_t MoqtControlParser::ProcessPublishNamespaceOk(
+ quic::QuicDataReader& reader) {
+ MoqtPublishNamespaceOk publish_namespace_ok;
+ if (!reader.ReadVarInt62(&publish_namespace_ok.request_id)) {
return 0;
}
- visitor_.OnAnnounceOkMessage(announce_ok);
+ visitor_.OnPublishNamespaceOkMessage(publish_namespace_ok);
return reader.PreviouslyReadPayload().length();
}
-size_t MoqtControlParser::ProcessAnnounceError(quic::QuicDataReader& reader) {
- MoqtAnnounceError announce_error;
+size_t MoqtControlParser::ProcessPublishNamespaceError(
+ quic::QuicDataReader& reader) {
+ MoqtPublishNamespaceError publish_namespace_error;
uint64_t error_code;
- if (!reader.ReadVarInt62(&announce_error.request_id) ||
+ if (!reader.ReadVarInt62(&publish_namespace_error.request_id) ||
!reader.ReadVarInt62(&error_code) ||
- !reader.ReadStringVarInt62(announce_error.error_reason)) {
+ !reader.ReadStringVarInt62(publish_namespace_error.error_reason)) {
return 0;
}
- announce_error.error_code = static_cast<RequestErrorCode>(error_code);
- visitor_.OnAnnounceErrorMessage(announce_error);
+ publish_namespace_error.error_code =
+ static_cast<RequestErrorCode>(error_code);
+ visitor_.OnPublishNamespaceErrorMessage(publish_namespace_error);
return reader.PreviouslyReadPayload().length();
}
-size_t MoqtControlParser::ProcessUnannounce(quic::QuicDataReader& reader) {
- MoqtUnannounce unannounce;
- if (!ReadTrackNamespace(reader, unannounce.track_namespace)) {
+size_t MoqtControlParser::ProcessPublishNamespaceDone(
+ quic::QuicDataReader& reader) {
+ MoqtPublishNamespaceDone unpublish_namespace;
+ if (!ReadTrackNamespace(reader, unpublish_namespace.track_namespace)) {
return 0;
}
- visitor_.OnUnannounceMessage(unannounce);
+ visitor_.OnPublishNamespaceDoneMessage(unpublish_namespace);
return reader.PreviouslyReadPayload().length();
}
-size_t MoqtControlParser::ProcessAnnounceCancel(quic::QuicDataReader& reader) {
- MoqtAnnounceCancel announce_cancel;
- if (!ReadTrackNamespace(reader, announce_cancel.track_namespace)) {
+size_t MoqtControlParser::ProcessPublishNamespaceCancel(
+ quic::QuicDataReader& reader) {
+ MoqtPublishNamespaceCancel publish_namespace_cancel;
+ if (!ReadTrackNamespace(reader, publish_namespace_cancel.track_namespace)) {
return 0;
}
uint64_t error_code;
if (!reader.ReadVarInt62(&error_code) ||
- !reader.ReadStringVarInt62(announce_cancel.error_reason)) {
+ !reader.ReadStringVarInt62(publish_namespace_cancel.error_reason)) {
return 0;
}
- announce_cancel.error_code = static_cast<RequestErrorCode>(error_code);
- visitor_.OnAnnounceCancelMessage(announce_cancel);
+ publish_namespace_cancel.error_code =
+ static_cast<RequestErrorCode>(error_code);
+ visitor_.OnPublishNamespaceCancelMessage(publish_namespace_cancel);
return reader.PreviouslyReadPayload().length();
}
@@ -674,9 +681,9 @@
size_t MoqtControlParser::ProcessSubscribeNamespace(
quic::QuicDataReader& reader) {
- MoqtSubscribeNamespace subscribe_announces;
- if (!reader.ReadVarInt62(&subscribe_announces.request_id) ||
- !ReadTrackNamespace(reader, subscribe_announces.track_namespace)) {
+ MoqtSubscribeNamespace subscribe_namespace;
+ if (!reader.ReadVarInt62(&subscribe_namespace.request_id) ||
+ !ReadTrackNamespace(reader, subscribe_namespace.track_namespace)) {
return 0;
}
KeyValuePairList parameters;
@@ -689,10 +696,10 @@
return 0;
}
if (!KeyValuePairListToVersionSpecificParameters(
- parameters, subscribe_announces.parameters)) {
+ parameters, subscribe_namespace.parameters)) {
return 0;
}
- visitor_.OnSubscribeNamespaceMessage(subscribe_announces);
+ visitor_.OnSubscribeNamespaceMessage(subscribe_namespace);
return reader.PreviouslyReadPayload().length();
}
diff --git a/quiche/quic/moqt/moqt_parser.h b/quiche/quic/moqt/moqt_parser.h
index e10beb9..8ee32cb 100644
--- a/quiche/quic/moqt/moqt_parser.h
+++ b/quiche/quic/moqt/moqt_parser.h
@@ -41,11 +41,16 @@
virtual void OnUnsubscribeMessage(const MoqtUnsubscribe& message) = 0;
virtual void OnPublishDoneMessage(const MoqtPublishDone& message) = 0;
virtual void OnSubscribeUpdateMessage(const MoqtSubscribeUpdate& message) = 0;
- virtual void OnAnnounceMessage(const MoqtAnnounce& message) = 0;
- virtual void OnAnnounceOkMessage(const MoqtAnnounceOk& message) = 0;
- virtual void OnAnnounceErrorMessage(const MoqtAnnounceError& message) = 0;
- virtual void OnUnannounceMessage(const MoqtUnannounce& message) = 0;
- virtual void OnAnnounceCancelMessage(const MoqtAnnounceCancel& message) = 0;
+ virtual void OnPublishNamespaceMessage(
+ const MoqtPublishNamespace& message) = 0;
+ virtual void OnPublishNamespaceOkMessage(
+ const MoqtPublishNamespaceOk& message) = 0;
+ virtual void OnPublishNamespaceErrorMessage(
+ const MoqtPublishNamespaceError& message) = 0;
+ virtual void OnPublishNamespaceDoneMessage(
+ const MoqtPublishNamespaceDone& message) = 0;
+ virtual void OnPublishNamespaceCancelMessage(
+ const MoqtPublishNamespaceCancel& message) = 0;
virtual void OnTrackStatusMessage(const MoqtTrackStatus& message) = 0;
virtual void OnTrackStatusOkMessage(const MoqtTrackStatusOk& message) = 0;
virtual void OnTrackStatusErrorMessage(
@@ -128,11 +133,11 @@
size_t ProcessUnsubscribe(quic::QuicDataReader& reader);
size_t ProcessPublishDone(quic::QuicDataReader& reader);
size_t ProcessSubscribeUpdate(quic::QuicDataReader& reader);
- size_t ProcessAnnounce(quic::QuicDataReader& reader);
- size_t ProcessAnnounceOk(quic::QuicDataReader& reader);
- size_t ProcessAnnounceError(quic::QuicDataReader& reader);
- size_t ProcessUnannounce(quic::QuicDataReader& reader);
- size_t ProcessAnnounceCancel(quic::QuicDataReader& reader);
+ size_t ProcessPublishNamespace(quic::QuicDataReader& reader);
+ size_t ProcessPublishNamespaceOk(quic::QuicDataReader& reader);
+ size_t ProcessPublishNamespaceError(quic::QuicDataReader& reader);
+ size_t ProcessPublishNamespaceDone(quic::QuicDataReader& reader);
+ size_t ProcessPublishNamespaceCancel(quic::QuicDataReader& reader);
size_t ProcessTrackStatus(quic::QuicDataReader& reader);
size_t ProcessTrackStatusOk(quic::QuicDataReader& reader);
size_t ProcessTrackStatusError(quic::QuicDataReader& reader);
diff --git a/quiche/quic/moqt/moqt_parser_test.cc b/quiche/quic/moqt/moqt_parser_test.cc
index eaee5c4..9b70469 100644
--- a/quiche/quic/moqt/moqt_parser_test.cc
+++ b/quiche/quic/moqt/moqt_parser_test.cc
@@ -38,14 +38,14 @@
MoqtMessageType::kSubscribeUpdate,
MoqtMessageType::kUnsubscribe,
MoqtMessageType::kPublishDone,
- MoqtMessageType::kAnnounceCancel,
MoqtMessageType::kTrackStatus,
MoqtMessageType::kTrackStatusOk,
MoqtMessageType::kTrackStatusError,
- MoqtMessageType::kAnnounce,
- MoqtMessageType::kAnnounceOk,
- MoqtMessageType::kAnnounceError,
- MoqtMessageType::kUnannounce,
+ MoqtMessageType::kPublishNamespace,
+ MoqtMessageType::kPublishNamespaceOk,
+ MoqtMessageType::kPublishNamespaceError,
+ MoqtMessageType::kPublishNamespaceDone,
+ MoqtMessageType::kPublishNamespaceCancel,
MoqtMessageType::kClientSetup,
MoqtMessageType::kServerSetup,
MoqtMessageType::kGoAway,
@@ -955,35 +955,38 @@
EXPECT_EQ(visitor_.parsing_error_code_, MoqtError::kProtocolViolation);
}
-TEST_F(MoqtMessageSpecificTest, AnnounceAuthorizationTokenTwice) {
+TEST_F(MoqtMessageSpecificTest, PublishNamespaceAuthorizationTokenTwice) {
webtransport::test::InMemoryStream stream(/*stream_id=*/0);
MoqtControlParser parser(kWebTrans, &stream, visitor_);
- char announce[] = {
+ char publish_namespace[] = {
0x06, 0x00, 0x15, 0x02, 0x01, 0x03, 0x66,
0x6f, 0x6f, // track_namespace = "foo"
0x02, // 2 params
0x03, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72, // authorization = "bar"
0x03, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72, // authorization = "bar"
};
- stream.Receive(absl::string_view(announce, sizeof(announce)), false);
+ stream.Receive(
+ absl::string_view(publish_namespace, sizeof(publish_namespace)), false);
parser.ReadAndDispatchMessages();
EXPECT_EQ(visitor_.messages_received_, 1);
}
-TEST_F(MoqtMessageSpecificTest, AnnounceHasDeliveryTimeout) {
+TEST_F(MoqtMessageSpecificTest, PublishNamespaceHasDeliveryTimeout) {
webtransport::test::InMemoryStream stream(/*stream_id=*/0);
MoqtControlParser parser(kWebTrans, &stream, visitor_);
- char announce[] = {
+ char publish_namespace[] = {
0x06, 0x00, 0x11, 0x02, 0x01, 0x03, 0x66,
0x6f, 0x6f, // track_namespace = "foo"
0x02, // 2 params
0x03, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72, // authorization_info = "bar"
0x02, 0x67, 0x10, // delivery_timeout = 10000
};
- stream.Receive(absl::string_view(announce, sizeof(announce)), false);
+ stream.Receive(
+ absl::string_view(publish_namespace, sizeof(publish_namespace)), false);
parser.ReadAndDispatchMessages();
EXPECT_EQ(visitor_.messages_received_, 0);
- EXPECT_EQ(visitor_.parsing_error_, "ANNOUNCE contains invalid parameters");
+ EXPECT_EQ(visitor_.parsing_error_,
+ "PUBLISH_NAMESPACE contains invalid parameters");
EXPECT_EQ(visitor_.parsing_error_code_, MoqtError::kProtocolViolation);
}
@@ -1477,22 +1480,25 @@
}
// All messages with TrackNamespace use ReadTrackNamespace too check this. Use
-// ANNOUNCE.
+// PUBLISH_NAMESPACE.
TEST_F(MoqtMessageSpecificTest, NamespaceTooSmall) {
webtransport::test::InMemoryStream stream(/*stream_id=*/0);
MoqtControlParser parser(kRawQuic, &stream, visitor_);
- char announce[7] = {
+ char publish_namespace[7] = {
0x06, 0x00, 0x04, 0x02, // request_id = 2
0x01, 0x00, // one empty namespace element
0x00, // no parameters
};
- stream.Receive(absl::string_view(announce, sizeof(announce)), false);
+ stream.Receive(
+ absl::string_view(publish_namespace, sizeof(publish_namespace)), false);
parser.ReadAndDispatchMessages();
EXPECT_EQ(visitor_.messages_received_, 1);
EXPECT_EQ(visitor_.parsing_error_, std::nullopt);
- --announce[2]; // Remove one element.
- --announce[4];
- stream.Receive(absl::string_view(announce, sizeof(announce) - 1), false);
+ --publish_namespace[2]; // Remove one element.
+ --publish_namespace[4];
+ stream.Receive(
+ absl::string_view(publish_namespace, sizeof(publish_namespace) - 1),
+ false);
parser.ReadAndDispatchMessages();
EXPECT_EQ(visitor_.messages_received_, 1);
EXPECT_EQ(visitor_.parsing_error_, "Invalid number of namespace elements");
@@ -1501,18 +1507,21 @@
TEST_F(MoqtMessageSpecificTest, NamespaceTooLarge) {
webtransport::test::InMemoryStream stream(/*stream_id=*/0);
MoqtControlParser parser(kRawQuic, &stream, visitor_);
- char announce[39] = {
+ char publish_namespace[39] = {
0x06, 0x00, 0x23, 0x02, // type, length = 35, request_id = 2
0x20, // 32 namespace elements. This is the maximum.
};
// 32 empty namespace elements + no parameters.
- stream.Receive(absl::string_view(announce, sizeof(announce) - 1), false);
+ stream.Receive(
+ absl::string_view(publish_namespace, sizeof(publish_namespace) - 1),
+ false);
parser.ReadAndDispatchMessages();
EXPECT_EQ(visitor_.messages_received_, 1);
EXPECT_EQ(visitor_.parsing_error_, std::nullopt);
- ++announce[2]; // Add one element.
- ++announce[4];
- stream.Receive(absl::string_view(announce, sizeof(announce)), false);
+ ++publish_namespace[2]; // Add one element.
+ ++publish_namespace[4];
+ stream.Receive(
+ absl::string_view(publish_namespace, sizeof(publish_namespace)), false);
parser.ReadAndDispatchMessages();
EXPECT_EQ(visitor_.messages_received_, 1);
EXPECT_EQ(visitor_.parsing_error_, "Invalid number of namespace elements");
diff --git a/quiche/quic/moqt/moqt_session.cc b/quiche/quic/moqt/moqt_session.cc
index 783a0cf..e0dbc62 100644
--- a/quiche/quic/moqt/moqt_session.cc
+++ b/quiche/quic/moqt/moqt_session.cc
@@ -277,7 +277,7 @@
<< peer_max_request_id_;
return false;
}
- if (outgoing_subscribe_announces_.contains(track_namespace)) {
+ if (outgoing_subscribe_namespaces_.contains(track_namespace)) {
std::move(callback)(
track_namespace, RequestErrorCode::kInternalError,
"SUBSCRIBE_NAMESPACE already outstanding for namespace");
@@ -291,15 +291,15 @@
SendControlMessage(framer_.SerializeSubscribeNamespace(message));
QUIC_DLOG(INFO) << ENDPOINT << "Sent SUBSCRIBE_NAMESPACE message for "
<< message.track_namespace;
- pending_outgoing_subscribe_announces_[message.request_id] =
+ pending_outgoing_subscribe_namespaces_[message.request_id] =
PendingSubscribeNamespaceData{track_namespace, std::move(callback)};
- outgoing_subscribe_announces_.emplace(track_namespace);
+ outgoing_subscribe_namespaces_.emplace(track_namespace);
return true;
}
bool MoqtSession::UnsubscribeNamespace(TrackNamespace track_namespace) {
QUICHE_DCHECK(track_namespace.IsValid());
- if (!outgoing_subscribe_announces_.contains(track_namespace)) {
+ if (!outgoing_subscribe_namespaces_.contains(track_namespace)) {
return false;
}
MoqtUnsubscribeNamespace message;
@@ -307,19 +307,21 @@
SendControlMessage(framer_.SerializeUnsubscribeNamespace(message));
QUIC_DLOG(INFO) << ENDPOINT << "Sent UNSUBSCRIBE_NAMESPACE message for "
<< message.track_namespace;
- outgoing_subscribe_announces_.erase(track_namespace);
+ outgoing_subscribe_namespaces_.erase(track_namespace);
return true;
}
-void MoqtSession::Announce(TrackNamespace track_namespace,
- MoqtOutgoingAnnounceCallback announce_callback,
- VersionSpecificParameters parameters) {
+void MoqtSession::PublishNamespace(
+ TrackNamespace track_namespace,
+ MoqtOutgoingPublishNamespaceCallback publish_namespace_callback,
+ VersionSpecificParameters parameters) {
QUICHE_DCHECK(track_namespace.IsValid());
- if (outgoing_announces_.contains(track_namespace)) {
- std::move(announce_callback)(
+ if (outgoing_publish_namespaces_.contains(track_namespace)) {
+ std::move(publish_namespace_callback)(
track_namespace,
- MoqtAnnounceErrorReason{RequestErrorCode::kInternalError,
- "ANNOUNCE already outstanding for namespace"});
+ MoqtPublishNamespaceErrorReason{
+ RequestErrorCode::kInternalError,
+ "PUBLISH_NAMESPACE already outstanding for namespace"});
return;
}
if (next_request_id_ >= peer_max_request_id_) {
@@ -330,51 +332,54 @@
SendControlMessage(framer_.SerializeRequestsBlocked(requests_blocked));
last_requests_blocked_sent_ = peer_max_request_id_;
}
- QUIC_DLOG(INFO) << ENDPOINT << "Tried to send ANNOUNCE with ID "
+ QUIC_DLOG(INFO) << ENDPOINT << "Tried to send PUBLISH_NAMESPACE with ID "
<< next_request_id_
<< " which is greater than the maximum ID "
<< peer_max_request_id_;
return;
}
if (received_goaway_ || sent_goaway_) {
- QUIC_DLOG(INFO) << ENDPOINT << "Tried to send ANNOUNCE after GOAWAY";
+ QUIC_DLOG(INFO) << ENDPOINT
+ << "Tried to send PUBLISH_NAMESPACE after GOAWAY";
return;
}
- MoqtAnnounce message;
+ MoqtPublishNamespace message;
message.request_id = next_request_id_;
next_request_id_ += 2;
message.track_namespace = track_namespace;
message.parameters = parameters;
- SendControlMessage(framer_.SerializeAnnounce(message));
- QUIC_DLOG(INFO) << ENDPOINT << "Sent ANNOUNCE message for "
+ SendControlMessage(framer_.SerializePublishNamespace(message));
+ QUIC_DLOG(INFO) << ENDPOINT << "Sent PUBLISH_NAMESPACE message for "
<< message.track_namespace;
- pending_outgoing_announces_[message.request_id] = track_namespace;
- outgoing_announces_[track_namespace] = std::move(announce_callback);
+ pending_outgoing_publish_namespaces_[message.request_id] = track_namespace;
+ outgoing_publish_namespaces_[track_namespace] =
+ std::move(publish_namespace_callback);
}
-bool MoqtSession::Unannounce(TrackNamespace track_namespace) {
+bool MoqtSession::PublishNamespaceDone(TrackNamespace track_namespace) {
QUICHE_DCHECK(track_namespace.IsValid());
- auto it = outgoing_announces_.find(track_namespace);
- if (it == outgoing_announces_.end()) {
- return false; // Could have been destroyed by ANNOUNCE_CANCEL.
+ auto it = outgoing_publish_namespaces_.find(track_namespace);
+ if (it == outgoing_publish_namespaces_.end()) {
+ return false; // Could have been destroyed by PUBLISH_NAMESPACE_CANCEL.
}
- MoqtUnannounce message;
+ MoqtPublishNamespaceDone message;
message.track_namespace = track_namespace;
- SendControlMessage(framer_.SerializeUnannounce(message));
- QUIC_DLOG(INFO) << ENDPOINT << "Sent UNANNOUNCE message for "
+ SendControlMessage(framer_.SerializePublishNamespaceDone(message));
+ QUIC_DLOG(INFO) << ENDPOINT << "Sent PUBLISH_NAMESPACE_DONE message for "
<< message.track_namespace;
- outgoing_announces_.erase(it);
+ outgoing_publish_namespaces_.erase(it);
return true;
}
-void MoqtSession::CancelAnnounce(TrackNamespace track_namespace,
- RequestErrorCode code,
- absl::string_view reason) {
+void MoqtSession::CancelPublishNamespace(TrackNamespace track_namespace,
+ RequestErrorCode code,
+ absl::string_view reason) {
QUICHE_DCHECK(track_namespace.IsValid());
- MoqtAnnounceCancel message{track_namespace, code, std::string(reason)};
+ MoqtPublishNamespaceCancel message{track_namespace, code,
+ std::string(reason)};
- SendControlMessage(framer_.SerializeAnnounceCancel(message));
- QUIC_DLOG(INFO) << ENDPOINT << "Sent ANNOUNCE_CANCEL message for "
+ SendControlMessage(framer_.SerializePublishNamespaceCancel(message));
+ QUIC_DLOG(INFO) << ENDPOINT << "Sent PUBLISH_NAMESPACE_CANCEL message for "
<< message.track_namespace << " with reason " << reason;
}
@@ -1193,98 +1198,104 @@
it->second->set_delivery_timeout(message.parameters.delivery_timeout);
}
-void MoqtSession::ControlStream::OnAnnounceMessage(
- const MoqtAnnounce& message) {
+void MoqtSession::ControlStream::OnPublishNamespaceMessage(
+ const MoqtPublishNamespace& message) {
if (!session_->ValidateRequestId(message.request_id)) {
return;
}
if (session_->sent_goaway_) {
- QUIC_DLOG(INFO) << ENDPOINT << "Received an ANNOUNCE after GOAWAY";
- MoqtAnnounceError error;
+ QUIC_DLOG(INFO) << ENDPOINT << "Received a PUBLISH_NAMESPACE after GOAWAY";
+ MoqtPublishNamespaceError error;
error.request_id = message.request_id;
error.error_code = RequestErrorCode::kUnauthorized;
- error.error_reason = "ANNOUNCE after GOAWAY";
- SendOrBufferMessage(session_->framer_.SerializeAnnounceError(error));
+ error.error_reason = "PUBLISH_NAMESPACE after GOAWAY";
+ SendOrBufferMessage(
+ session_->framer_.SerializePublishNamespaceError(error));
return;
}
- std::optional<MoqtAnnounceErrorReason> error =
- session_->callbacks_.incoming_announce_callback(message.track_namespace,
- message.parameters);
+ std::optional<MoqtPublishNamespaceErrorReason> error =
+ session_->callbacks_.incoming_publish_namespace_callback(
+ message.track_namespace, message.parameters);
if (error.has_value()) {
- MoqtAnnounceError reply;
+ MoqtPublishNamespaceError reply;
reply.request_id = message.request_id;
reply.error_code = error->error_code;
reply.error_reason = error->reason_phrase;
- SendOrBufferMessage(session_->framer_.SerializeAnnounceError(reply));
+ SendOrBufferMessage(
+ session_->framer_.SerializePublishNamespaceError(reply));
return;
}
- MoqtAnnounceOk ok;
+ MoqtPublishNamespaceOk ok;
ok.request_id = message.request_id;
- SendOrBufferMessage(session_->framer_.SerializeAnnounceOk(ok));
+ SendOrBufferMessage(session_->framer_.SerializePublishNamespaceOk(ok));
}
-// Do not enforce that there is only one of OK or ERROR per ANNOUNCE. Upon
-// ERROR, we immediately destroy the state.
-void MoqtSession::ControlStream::OnAnnounceOkMessage(
- const MoqtAnnounceOk& message) {
- auto it = session_->pending_outgoing_announces_.find(message.request_id);
- if (it == session_->pending_outgoing_announces_.end()) {
+// Do not enforce that there is only one of OK or ERROR per PUBLISH_NAMESPACE.
+// Upon ERROR, we immediately destroy the state.
+void MoqtSession::ControlStream::OnPublishNamespaceOkMessage(
+ const MoqtPublishNamespaceOk& message) {
+ auto it =
+ session_->pending_outgoing_publish_namespaces_.find(message.request_id);
+ if (it == session_->pending_outgoing_publish_namespaces_.end()) {
session_->Error(MoqtError::kProtocolViolation,
- "Received ANNOUNCE_OK for unknown request_id");
+ "Received PUBLISH_NAMESPACE_OK for unknown request_id");
return;
}
TrackNamespace track_namespace = it->second;
- session_->pending_outgoing_announces_.erase(it);
- auto callback_it = session_->outgoing_announces_.find(track_namespace);
- if (callback_it == session_->outgoing_announces_.end()) {
- // It might have already been destroyed due to UNANNOUNCE.
+ session_->pending_outgoing_publish_namespaces_.erase(it);
+ auto callback_it =
+ session_->outgoing_publish_namespaces_.find(track_namespace);
+ if (callback_it == session_->outgoing_publish_namespaces_.end()) {
+ // It might have already been destroyed due to PUBLISH_NAMESPACE_DONE.
return;
}
std::move(callback_it->second)(track_namespace, std::nullopt);
}
-void MoqtSession::ControlStream::OnAnnounceErrorMessage(
- const MoqtAnnounceError& message) {
- auto it = session_->pending_outgoing_announces_.find(message.request_id);
- if (it == session_->pending_outgoing_announces_.end()) {
+void MoqtSession::ControlStream::OnPublishNamespaceErrorMessage(
+ const MoqtPublishNamespaceError& message) {
+ auto it =
+ session_->pending_outgoing_publish_namespaces_.find(message.request_id);
+ if (it == session_->pending_outgoing_publish_namespaces_.end()) {
session_->Error(MoqtError::kProtocolViolation,
- "Received ANNOUNCE_ERROR for unknown request_id");
+ "Received PUBLISH_NAMESPACE_ERROR for unknown request_id");
return;
}
TrackNamespace track_namespace = it->second;
- session_->pending_outgoing_announces_.erase(it);
- auto it2 = session_->outgoing_announces_.find(track_namespace);
- if (it2 == session_->outgoing_announces_.end()) {
- return; // State might have been destroyed due to UNANNOUNCE.
+ session_->pending_outgoing_publish_namespaces_.erase(it);
+ auto it2 = session_->outgoing_publish_namespaces_.find(track_namespace);
+ if (it2 == session_->outgoing_publish_namespaces_.end()) {
+ return; // State might have been destroyed due to PUBLISH_NAMESPACE_DONE.
}
std::move(it2->second)(
track_namespace,
- MoqtAnnounceErrorReason{message.error_code,
- std::string(message.error_reason)});
- session_->outgoing_announces_.erase(it2);
+ MoqtPublishNamespaceErrorReason{message.error_code,
+ std::string(message.error_reason)});
+ session_->outgoing_publish_namespaces_.erase(it2);
}
-void MoqtSession::ControlStream::OnUnannounceMessage(
- const MoqtUnannounce& message) {
- session_->callbacks_.incoming_announce_callback(message.track_namespace,
- std::nullopt);
+void MoqtSession::ControlStream::OnPublishNamespaceDoneMessage(
+ const MoqtPublishNamespaceDone& message) {
+ session_->callbacks_.incoming_publish_namespace_callback(
+ message.track_namespace, std::nullopt);
}
-void MoqtSession::ControlStream::OnAnnounceCancelMessage(
- const MoqtAnnounceCancel& message) {
+void MoqtSession::ControlStream::OnPublishNamespaceCancelMessage(
+ const MoqtPublishNamespaceCancel& message) {
// The spec currently says that if a later SUBSCRIBE arrives for this
// namespace, that SHOULD be a session error. I'm hoping that via Issue #557,
// this will go away. Regardless, a SHOULD will not compel the session to keep
// state forever, so there is no support for this requirement.
- auto it = session_->outgoing_announces_.find(message.track_namespace);
- if (it == session_->outgoing_announces_.end()) {
- return; // State might have been destroyed due to UNANNOUNCE.
+ auto it =
+ session_->outgoing_publish_namespaces_.find(message.track_namespace);
+ if (it == session_->outgoing_publish_namespaces_.end()) {
+ return; // State might have been destroyed due to PUBLISH_NAMESPACE_DONE.
}
std::move(it->second)(
message.track_namespace,
- MoqtAnnounceErrorReason{message.error_code,
- std::string(message.error_reason)});
- session_->outgoing_announces_.erase(it);
+ MoqtPublishNamespaceErrorReason{message.error_code,
+ std::string(message.error_reason)});
+ session_->outgoing_publish_namespaces_.erase(it);
}
void MoqtSession::ControlStream::OnTrackStatusMessage(
@@ -1355,7 +1366,7 @@
session_->framer_.SerializeSubscribeNamespaceError(error));
return;
}
- if (!session_->incoming_subscribe_announces_.AddNamespace(
+ if (!session_->incoming_subscribe_namespace_.AddNamespace(
message.track_namespace)) {
QUIC_DLOG(INFO) << ENDPOINT << "Received a SUBSCRIBE_NAMESPACE for "
<< message.track_namespace
@@ -1369,7 +1380,7 @@
return;
}
std::optional<MoqtSubscribeErrorReason> result =
- session_->callbacks_.incoming_subscribe_announces_callback(
+ session_->callbacks_.incoming_subscribe_namespace_callback(
message.track_namespace, message.parameters);
if (result.has_value()) {
MoqtSubscribeNamespaceError error;
@@ -1378,7 +1389,7 @@
error.error_reason = result->reason_phrase;
SendOrBufferMessage(
session_->framer_.SerializeSubscribeNamespaceError(error));
- session_->incoming_subscribe_announces_.RemoveNamespace(
+ session_->incoming_subscribe_namespace_.RemoveNamespace(
message.track_namespace);
return;
}
@@ -1390,21 +1401,21 @@
void MoqtSession::ControlStream::OnSubscribeNamespaceOkMessage(
const MoqtSubscribeNamespaceOk& message) {
auto it =
- session_->pending_outgoing_subscribe_announces_.find(message.request_id);
- if (it == session_->pending_outgoing_subscribe_announces_.end()) {
+ session_->pending_outgoing_subscribe_namespaces_.find(message.request_id);
+ if (it == session_->pending_outgoing_subscribe_namespaces_.end()) {
session_->Error(MoqtError::kProtocolViolation,
"Received SUBSCRIBE_NAMESPACE_OK for unknown request_id");
return; // UNSUBSCRIBE_NAMESPACE may already have deleted the entry.
}
std::move(it->second.callback)(it->second.track_namespace, std::nullopt, "");
- session_->pending_outgoing_subscribe_announces_.erase(it);
+ session_->pending_outgoing_subscribe_namespaces_.erase(it);
}
void MoqtSession::ControlStream::OnSubscribeNamespaceErrorMessage(
const MoqtSubscribeNamespaceError& message) {
auto it =
- session_->pending_outgoing_subscribe_announces_.find(message.request_id);
- if (it == session_->pending_outgoing_subscribe_announces_.end()) {
+ session_->pending_outgoing_subscribe_namespaces_.find(message.request_id);
+ if (it == session_->pending_outgoing_subscribe_namespaces_.end()) {
session_->Error(
MoqtError::kProtocolViolation,
"Received SUBSCRIBE_NAMESPACE_ERROR for unknown request_id");
@@ -1412,17 +1423,17 @@
}
std::move(it->second.callback)(it->second.track_namespace, message.error_code,
absl::string_view(message.error_reason));
- session_->outgoing_subscribe_announces_.erase(it->second.track_namespace);
- session_->pending_outgoing_subscribe_announces_.erase(it);
+ session_->outgoing_subscribe_namespaces_.erase(it->second.track_namespace);
+ session_->pending_outgoing_subscribe_namespaces_.erase(it);
}
void MoqtSession::ControlStream::OnUnsubscribeNamespaceMessage(
const MoqtUnsubscribeNamespace& message) {
// MoqtSession keeps no state here, so just tell the application.
std::optional<MoqtSubscribeErrorReason> result =
- session_->callbacks_.incoming_subscribe_announces_callback(
+ session_->callbacks_.incoming_subscribe_namespace_callback(
message.track_namespace, std::nullopt);
- session_->incoming_subscribe_announces_.RemoveNamespace(
+ session_->incoming_subscribe_namespace_.RemoveNamespace(
message.track_namespace);
}
diff --git a/quiche/quic/moqt/moqt_session.h b/quiche/quic/moqt/moqt_session.h
index 407a5c7..55a67cf 100644
--- a/quiche/quic/moqt/moqt_session.h
+++ b/quiche/quic/moqt/moqt_session.h
@@ -101,18 +101,22 @@
VersionSpecificParameters parameters);
bool UnsubscribeNamespace(TrackNamespace track_namespace);
- // Send an ANNOUNCE message for |track_namespace|, and call
- // |announce_callback| when the response arrives. Will fail immediately if
- // there is already an unresolved ANNOUNCE for that namespace.
- void Announce(TrackNamespace track_namespace,
- MoqtOutgoingAnnounceCallback announce_callback,
- VersionSpecificParameters parameters);
- // Returns true if message was sent, false if there is no ANNOUNCE to cancel.
- bool Unannounce(TrackNamespace track_namespace);
+ // Send a PUBLISH_NAMESPACE message for |track_namespace|, and call
+ // |publish_namespace_callback| when the response arrives. Will fail
+ // immediately if there is already an unresolved PUBLISH_NAMESPACE for that
+ // namespace.
+ void PublishNamespace(
+ TrackNamespace track_namespace,
+ MoqtOutgoingPublishNamespaceCallback publish_namespace_callback,
+ VersionSpecificParameters parameters);
+ // Returns true if message was sent, false if there is no PUBLISH_NAMESPACE to
+ // cancel.
+ bool PublishNamespaceDone(TrackNamespace track_namespace);
// Allows the subscriber to declare it will not subscribe to |track_namespace|
// anymore.
- void CancelAnnounce(TrackNamespace track_namespace, RequestErrorCode code,
- absl::string_view reason_phrase);
+ void CancelPublishNamespace(TrackNamespace track_namespace,
+ RequestErrorCode code,
+ absl::string_view reason_phrase);
// MoqtSessionInterface implementation.
MoqtSessionCallbacks& callbacks() override { return callbacks_; }
@@ -232,11 +236,16 @@
// There is no state to update for SUBSCRIBE_DONE.
void OnPublishDoneMessage(const MoqtPublishDone& /*message*/) override;
void OnSubscribeUpdateMessage(const MoqtSubscribeUpdate& message) override;
- void OnAnnounceMessage(const MoqtAnnounce& message) override;
- void OnAnnounceOkMessage(const MoqtAnnounceOk& message) override;
- void OnAnnounceErrorMessage(const MoqtAnnounceError& message) override;
- void OnUnannounceMessage(const MoqtUnannounce& message) override;
- void OnAnnounceCancelMessage(const MoqtAnnounceCancel& message) override;
+ void OnPublishNamespaceMessage(
+ const MoqtPublishNamespace& message) override;
+ void OnPublishNamespaceOkMessage(
+ const MoqtPublishNamespaceOk& message) override;
+ void OnPublishNamespaceErrorMessage(
+ const MoqtPublishNamespaceError& message) override;
+ void OnPublishNamespaceDoneMessage(
+ const MoqtPublishNamespaceDone& /*message*/) override;
+ void OnPublishNamespaceCancelMessage(
+ const MoqtPublishNamespaceCancel& message) override;
void OnTrackStatusMessage(const MoqtTrackStatus& message) override;
void OnTrackStatusOkMessage(const MoqtTrackStatusOk& /*message*/) override {
}
@@ -830,25 +839,26 @@
absl::flat_hash_map<FullTrackName, MoqtPublishingMonitorInterface*>
monitoring_interfaces_for_published_tracks_;
- // Outgoing ANNOUNCE for which no OK or ERROR has been received.
- absl::flat_hash_map<uint64_t, TrackNamespace> pending_outgoing_announces_;
- // All outgoing ANNOUNCE.
- absl::flat_hash_map<TrackNamespace, MoqtOutgoingAnnounceCallback>
- outgoing_announces_;
+ // Outgoing PUBLISH_NAMESPACE for which no OK or ERROR has been received.
+ absl::flat_hash_map<uint64_t, TrackNamespace>
+ pending_outgoing_publish_namespaces_;
+ // All outgoing PUBLISH_NAMESPACE.
+ absl::flat_hash_map<TrackNamespace, MoqtOutgoingPublishNamespaceCallback>
+ outgoing_publish_namespaces_;
// The value is nullptr after OK or ERROR is received. The entry is deleted
// when sending UNSUBSCRIBE_NAMESPACE, to make sure the application doesn't
- // unsubscribe from something that it isn't subscribed to. ANNOUNCEs that
- // result from this subscription use incoming_announce_callback.
+ // unsubscribe from something that it isn't subscribed to. PUBLISH_NAMESPACEs
+ // that result from this subscription use incoming_publish_namespace_callback.
struct PendingSubscribeNamespaceData {
TrackNamespace track_namespace;
MoqtOutgoingSubscribeNamespaceCallback callback;
};
absl::flat_hash_map<uint64_t, PendingSubscribeNamespaceData>
- pending_outgoing_subscribe_announces_;
- absl::flat_hash_set<TrackNamespace> outgoing_subscribe_announces_;
+ pending_outgoing_subscribe_namespaces_;
+ absl::flat_hash_set<TrackNamespace> outgoing_subscribe_namespaces_;
// It's an error if the namespaces overlap, so keep track of them.
- NamespaceTree incoming_subscribe_announces_;
+ NamespaceTree incoming_subscribe_namespace_;
// The minimum request ID the peer can use that is monotonically increasing.
uint64_t next_incoming_request_id_ = 0;
diff --git a/quiche/quic/moqt/moqt_session_callbacks.h b/quiche/quic/moqt/moqt_session_callbacks.h
index cc0a35c..f104de0 100644
--- a/quiche/quic/moqt/moqt_session_callbacks.h
+++ b/quiche/quic/moqt/moqt_session_callbacks.h
@@ -29,10 +29,11 @@
// Called from the session destructor.
using MoqtSessionDeletedCallback = quiche::SingleUseCallback<void()>;
-// Called whenever an ANNOUNCE or UNANNOUNCE message is received from the peer.
-// ANNOUNCE sets a value for |parameters|, UNANNOUNCE does not.
-using MoqtIncomingAnnounceCallback =
- quiche::MultiUseCallback<std::optional<MoqtAnnounceErrorReason>(
+// Called whenever a PUBLISH_NAMESPACE or PUBLISH_NAMESPACE_DONE message is
+// received from the peer. PUBLISH_NAMESPACE sets a value for |parameters|,
+// PUBLISH_NAMESPACE_DONE does not.
+using MoqtIncomingPublishNamespaceCallback =
+ quiche::MultiUseCallback<std::optional<MoqtPublishNamespaceErrorReason>(
const TrackNamespace& track_namespace,
const std::optional<VersionSpecificParameters>& parameters)>;
@@ -46,12 +47,13 @@
const TrackNamespace& track_namespace,
std::optional<VersionSpecificParameters> parameters)>;
-inline std::optional<MoqtAnnounceErrorReason> DefaultIncomingAnnounceCallback(
+inline std::optional<MoqtPublishNamespaceErrorReason>
+DefaultIncomingPublishNamespaceCallback(
const TrackNamespace& /*track_namespace*/,
std::optional<VersionSpecificParameters> /*parameters*/) {
- return std::optional(MoqtAnnounceErrorReason{
+ return std::optional(MoqtPublishNamespaceErrorReason{
RequestErrorCode::kNotSupported,
- "This endpoint does not accept incoming ANNOUNCE messages"});
+ "This endpoint does not accept incoming PUBLISH_NAMESPACE messages"});
};
inline std::optional<MoqtSubscribeErrorReason>
@@ -72,9 +74,9 @@
+[](absl::string_view) {};
MoqtSessionDeletedCallback session_deleted_callback = +[] {};
- MoqtIncomingAnnounceCallback incoming_announce_callback =
- DefaultIncomingAnnounceCallback;
- MoqtIncomingSubscribeNamespaceCallback incoming_subscribe_announces_callback =
+ MoqtIncomingPublishNamespaceCallback incoming_publish_namespace_callback =
+ DefaultIncomingPublishNamespaceCallback;
+ MoqtIncomingSubscribeNamespaceCallback incoming_subscribe_namespace_callback =
DefaultIncomingSubscribeNamespaceCallback;
const quic::QuicClock* clock = quic::QuicDefaultClock::Get();
};
diff --git a/quiche/quic/moqt/moqt_session_interface.h b/quiche/quic/moqt/moqt_session_interface.h
index b60439d..cc2b51c 100644
--- a/quiche/quic/moqt/moqt_session_interface.h
+++ b/quiche/quic/moqt/moqt_session_interface.h
@@ -63,17 +63,18 @@
using FetchResponseCallback =
quiche::SingleUseCallback<void(std::unique_ptr<MoqtFetchTask> fetch_task)>;
-// TODO(martinduke): MoqtOutgoingAnnounceCallback and
+// TODO(martinduke): MoqtOutgoingPublishNamespaceCallback and
// MoqtOutgoingSubscribeNamespaceCallback are deprecated. Remove.
-// If |error_message| is nullopt, this is triggered by an ANNOUNCE_OK.
-// Otherwise, it is triggered by ANNOUNCE_ERROR or ANNOUNCE_CANCEL. For
-// ERROR or CANCEL, MoqtSession is deleting all ANNOUNCE state immediately
-// after calling this callback. Alternatively, the application can call
-// Unannounce() to delete the state.
-using MoqtOutgoingAnnounceCallback = quiche::MultiUseCallback<void(
+// If |error_message| is nullopt, this is triggered by a PUBLISH_NAMESPACE_OK.
+// Otherwise, it is triggered by PUBLISH_NAMESPACE_ERROR or
+// PUBLISH_NAMESPACE_CANCEL. For ERROR or CANCEL, MoqtSession is deleting all
+// PUBLISH_NAMESPACE state immediately after calling this callback.
+// Alternatively, the application can call PublishNamespaceDone() to delete the
+// state.
+using MoqtOutgoingPublishNamespaceCallback = quiche::MultiUseCallback<void(
TrackNamespace track_namespace,
- std::optional<MoqtAnnounceErrorReason> error)>;
+ std::optional<MoqtPublishNamespaceErrorReason> error)>;
using MoqtOutgoingSubscribeNamespaceCallback = quiche::SingleUseCallback<void(
TrackNamespace track_namespace, std::optional<RequestErrorCode> error,
@@ -83,7 +84,7 @@
public:
virtual ~MoqtSessionInterface() = default;
- // TODO: move ANNOUNCE logic here.
+ // TODO: move PUBLISH_NAMESPACE logic here.
// Callbacks for session-level events.
virtual MoqtSessionCallbacks& callbacks() = 0;
@@ -159,8 +160,8 @@
// TODO(martinduke): Add an API for absolute joining fetch.
// TODO: Add SubscribeNamespace, UnsubscribeNamespace method.
- // TODO: Add Announce, Unannounce method.
- // TODO: Add AnnounceCancel method.
+ // TODO: Add PublishNamespace, PublishNamespaceDone method.
+ // TODO: Add PublishNamespaceCancel method.
// TODO: Add TrackStatusRequest method.
// TODO: Add SubscribeUpdate, PublishDone method.
diff --git a/quiche/quic/moqt/moqt_session_test.cc b/quiche/quic/moqt/moqt_session_test.cc
index 5a62fb0..348e2c7 100644
--- a/quiche/quic/moqt/moqt_session_test.cc
+++ b/quiche/quic/moqt/moqt_session_test.cc
@@ -154,8 +154,8 @@
.WillByDefault(Return(MoqtForwardingPreference::kSubgroup));
}
- // The publisher receives SUBSCRIBE and synchronously announces it will
- // publish objects.
+ // The publisher receives SUBSCRIBE and synchronously publishes namespaces it
+ // supports.
MoqtObjectListener* ReceiveSubscribeSynchronousOk(
MockTrackPublisher* publisher, MoqtSubscribe& subscribe,
MoqtControlParserVisitor* control_parser, uint64_t track_alias = 0) {
@@ -384,112 +384,116 @@
stream_input->OnPublishMessage(publish);
}
-TEST_F(MoqtSessionTest, AnnounceWithOkAndCancel) {
+TEST_F(MoqtSessionTest, PublishNamespaceWithOkAndCancel) {
testing::MockFunction<void(
TrackNamespace track_namespace,
- std::optional<MoqtAnnounceErrorReason> error_message)>
- announce_resolved_callback;
+ std::optional<MoqtPublishNamespaceErrorReason> error_message)>
+ publish_namespace_resolved_callback;
std::unique_ptr<MoqtControlParserVisitor> stream_input =
MoqtSessionPeer::CreateControlStream(&session_, &mock_stream_);
EXPECT_CALL(mock_session_, GetStreamById(_)).WillOnce(Return(&mock_stream_));
- EXPECT_CALL(mock_stream_,
- Writev(ControlMessageOfType(MoqtMessageType::kAnnounce), _));
- session_.Announce(TrackNamespace("foo"),
- announce_resolved_callback.AsStdFunction(),
- VersionSpecificParameters());
+ EXPECT_CALL(
+ mock_stream_,
+ Writev(ControlMessageOfType(MoqtMessageType::kPublishNamespace), _));
+ session_.PublishNamespace(TrackNamespace("foo"),
+ publish_namespace_resolved_callback.AsStdFunction(),
+ VersionSpecificParameters());
- MoqtAnnounceOk ok = {
+ MoqtPublishNamespaceOk ok = {
/*request_id=*/0,
};
- EXPECT_CALL(announce_resolved_callback, Call(_, _))
+ EXPECT_CALL(publish_namespace_resolved_callback, Call(_, _))
.WillOnce([&](TrackNamespace track_namespace,
- std::optional<MoqtAnnounceErrorReason> error) {
+ std::optional<MoqtPublishNamespaceErrorReason> error) {
EXPECT_EQ(track_namespace, TrackNamespace("foo"));
EXPECT_FALSE(error.has_value());
});
- stream_input->OnAnnounceOkMessage(ok);
+ stream_input->OnPublishNamespaceOkMessage(ok);
- MoqtAnnounceCancel cancel = {
+ MoqtPublishNamespaceCancel cancel = {
TrackNamespace("foo"),
RequestErrorCode::kInternalError,
/*error_reason=*/"Test error",
};
- EXPECT_CALL(announce_resolved_callback, Call(_, _))
+ EXPECT_CALL(publish_namespace_resolved_callback, Call(_, _))
.WillOnce([&](TrackNamespace track_namespace,
- std::optional<MoqtAnnounceErrorReason> error) {
+ std::optional<MoqtPublishNamespaceErrorReason> error) {
EXPECT_EQ(track_namespace, TrackNamespace("foo"));
ASSERT_TRUE(error.has_value());
EXPECT_EQ(error->error_code, RequestErrorCode::kInternalError);
EXPECT_EQ(error->reason_phrase, "Test error");
});
- stream_input->OnAnnounceCancelMessage(cancel);
+ stream_input->OnPublishNamespaceCancelMessage(cancel);
// State is gone.
- EXPECT_FALSE(session_.Unannounce(TrackNamespace("foo")));
+ EXPECT_FALSE(session_.PublishNamespaceDone(TrackNamespace("foo")));
}
-TEST_F(MoqtSessionTest, AnnounceWithOkAndUnannounce) {
+TEST_F(MoqtSessionTest, PublishNamespaceWithOkAndPublishNamespaceDone) {
testing::MockFunction<void(
TrackNamespace track_namespace,
- std::optional<MoqtAnnounceErrorReason> error_message)>
- announce_resolved_callback;
+ std::optional<MoqtPublishNamespaceErrorReason> error_message)>
+ publish_namespace_resolved_callback;
std::unique_ptr<MoqtControlParserVisitor> stream_input =
MoqtSessionPeer::CreateControlStream(&session_, &mock_stream_);
EXPECT_CALL(mock_session_, GetStreamById(_)).WillOnce(Return(&mock_stream_));
- EXPECT_CALL(mock_stream_,
- Writev(ControlMessageOfType(MoqtMessageType::kAnnounce), _));
- session_.Announce(TrackNamespace{"foo"},
- announce_resolved_callback.AsStdFunction(),
- VersionSpecificParameters());
+ EXPECT_CALL(
+ mock_stream_,
+ Writev(ControlMessageOfType(MoqtMessageType::kPublishNamespace), _));
+ session_.PublishNamespace(TrackNamespace{"foo"},
+ publish_namespace_resolved_callback.AsStdFunction(),
+ VersionSpecificParameters());
- MoqtAnnounceOk ok = {
+ MoqtPublishNamespaceOk ok = {
/*request_id=*/0,
};
- EXPECT_CALL(announce_resolved_callback, Call(_, _))
+ EXPECT_CALL(publish_namespace_resolved_callback, Call(_, _))
.WillOnce([&](TrackNamespace track_namespace,
- std::optional<MoqtAnnounceErrorReason> error) {
+ std::optional<MoqtPublishNamespaceErrorReason> error) {
EXPECT_EQ(track_namespace, TrackNamespace{"foo"});
EXPECT_FALSE(error.has_value());
});
- stream_input->OnAnnounceOkMessage(ok);
+ stream_input->OnPublishNamespaceOkMessage(ok);
EXPECT_CALL(mock_session_, GetStreamById(_)).WillOnce(Return(&mock_stream_));
- EXPECT_CALL(mock_stream_,
- Writev(ControlMessageOfType(MoqtMessageType::kUnannounce), _));
- session_.Unannounce(TrackNamespace{"foo"});
+ EXPECT_CALL(
+ mock_stream_,
+ Writev(ControlMessageOfType(MoqtMessageType::kPublishNamespaceDone), _));
+ session_.PublishNamespaceDone(TrackNamespace{"foo"});
// State is gone.
- EXPECT_FALSE(session_.Unannounce(TrackNamespace{"foo"}));
+ EXPECT_FALSE(session_.PublishNamespaceDone(TrackNamespace{"foo"}));
}
-TEST_F(MoqtSessionTest, AnnounceWithError) {
+TEST_F(MoqtSessionTest, PublishNamespaceWithError) {
testing::MockFunction<void(
TrackNamespace track_namespace,
- std::optional<MoqtAnnounceErrorReason> error_message)>
- announce_resolved_callback;
+ std::optional<MoqtPublishNamespaceErrorReason> error_message)>
+ publish_namespace_resolved_callback;
std::unique_ptr<MoqtControlParserVisitor> stream_input =
MoqtSessionPeer::CreateControlStream(&session_, &mock_stream_);
EXPECT_CALL(mock_session_, GetStreamById(_)).WillOnce(Return(&mock_stream_));
- EXPECT_CALL(mock_stream_,
- Writev(ControlMessageOfType(MoqtMessageType::kAnnounce), _));
- session_.Announce(TrackNamespace{"foo"},
- announce_resolved_callback.AsStdFunction(),
- VersionSpecificParameters());
+ EXPECT_CALL(
+ mock_stream_,
+ Writev(ControlMessageOfType(MoqtMessageType::kPublishNamespace), _));
+ session_.PublishNamespace(TrackNamespace{"foo"},
+ publish_namespace_resolved_callback.AsStdFunction(),
+ VersionSpecificParameters());
- MoqtAnnounceError error = {
+ MoqtPublishNamespaceError error = {
/*request_id=*/0,
/*error_code=*/RequestErrorCode::kInternalError,
/*reason_phrase=*/"Test error",
};
- EXPECT_CALL(announce_resolved_callback, Call(_, _))
+ EXPECT_CALL(publish_namespace_resolved_callback, Call(_, _))
.WillOnce([&](TrackNamespace track_namespace,
- std::optional<MoqtAnnounceErrorReason> error) {
+ std::optional<MoqtPublishNamespaceErrorReason> error) {
EXPECT_EQ(track_namespace, TrackNamespace{"foo"});
ASSERT_TRUE(error.has_value());
EXPECT_EQ(error->error_code, RequestErrorCode::kInternalError);
EXPECT_EQ(error->reason_phrase, "Test error");
});
- stream_input->OnAnnounceErrorMessage(error);
+ stream_input->OnPublishNamespaceErrorMessage(error);
// State is gone.
- EXPECT_FALSE(session_.Unannounce(TrackNamespace{"foo"}));
+ EXPECT_FALSE(session_.PublishNamespaceDone(TrackNamespace{"foo"}));
}
TEST_F(MoqtSessionTest, AsynchronousSubscribeReturnsOk) {
@@ -940,88 +944,89 @@
EXPECT_EQ(MoqtSessionPeer::remote_track(&session_, 2), nullptr);
}
-TEST_F(MoqtSessionTest, ReplyToAnnounceWithOkThenUnannounce) {
+TEST_F(MoqtSessionTest, ReplyToPublishNamespaceWithOkThenPublishNamespaceDone) {
TrackNamespace track_namespace{"foo"};
std::unique_ptr<MoqtControlParserVisitor> stream_input =
MoqtSessionPeer::CreateControlStream(&session_, &mock_stream_);
auto parameters = std::make_optional<VersionSpecificParameters>(
AuthTokenType::kOutOfBand, "foo");
- MoqtAnnounce announce = {
+ MoqtPublishNamespace publish_namespace = {
kDefaultPeerRequestId,
track_namespace,
*parameters,
};
- EXPECT_CALL(session_callbacks_.incoming_announce_callback,
+ EXPECT_CALL(session_callbacks_.incoming_publish_namespace_callback,
Call(track_namespace, parameters))
.WillOnce(Return(std::nullopt));
- EXPECT_CALL(
- mock_stream_,
- Writev(SerializedControlMessage(MoqtAnnounceOk{kDefaultPeerRequestId}),
- _));
- stream_input->OnAnnounceMessage(announce);
- MoqtUnannounce unannounce = {
+ EXPECT_CALL(mock_stream_,
+ Writev(SerializedControlMessage(
+ MoqtPublishNamespaceOk{kDefaultPeerRequestId}),
+ _));
+ stream_input->OnPublishNamespaceMessage(publish_namespace);
+ MoqtPublishNamespaceDone unpublish_namespace = {
track_namespace,
};
- EXPECT_CALL(session_callbacks_.incoming_announce_callback,
+ EXPECT_CALL(session_callbacks_.incoming_publish_namespace_callback,
Call(track_namespace, std::optional<VersionSpecificParameters>()))
.WillOnce(Return(std::nullopt));
- stream_input->OnUnannounceMessage(unannounce);
+ stream_input->OnPublishNamespaceDoneMessage(unpublish_namespace);
}
-TEST_F(MoqtSessionTest, ReplyToAnnounceWithOkThenAnnounceCancel) {
+TEST_F(MoqtSessionTest,
+ ReplyToPublishNamespaceWithOkThenPublishNamespaceCancel) {
TrackNamespace track_namespace{"foo"};
std::unique_ptr<MoqtControlParserVisitor> stream_input =
MoqtSessionPeer::CreateControlStream(&session_, &mock_stream_);
auto parameters = std::make_optional<VersionSpecificParameters>(
AuthTokenType::kOutOfBand, "foo");
- MoqtAnnounce announce = {
+ MoqtPublishNamespace publish_namespace = {
kDefaultPeerRequestId,
track_namespace,
*parameters,
};
- EXPECT_CALL(session_callbacks_.incoming_announce_callback,
+ EXPECT_CALL(session_callbacks_.incoming_publish_namespace_callback,
Call(track_namespace, parameters))
.WillOnce(Return(std::nullopt));
- EXPECT_CALL(
- mock_stream_,
- Writev(SerializedControlMessage(MoqtAnnounceOk{kDefaultPeerRequestId}),
- _));
- stream_input->OnAnnounceMessage(announce);
EXPECT_CALL(mock_stream_,
- Writev(SerializedControlMessage(MoqtAnnounceCancel{
+ Writev(SerializedControlMessage(
+ MoqtPublishNamespaceOk{kDefaultPeerRequestId}),
+ _));
+ stream_input->OnPublishNamespaceMessage(publish_namespace);
+ EXPECT_CALL(mock_stream_,
+ Writev(SerializedControlMessage(MoqtPublishNamespaceCancel{
track_namespace, RequestErrorCode::kInternalError,
"deadbeef"}),
_));
- session_.CancelAnnounce(track_namespace, RequestErrorCode::kInternalError,
- "deadbeef");
+ session_.CancelPublishNamespace(track_namespace,
+ RequestErrorCode::kInternalError, "deadbeef");
}
-TEST_F(MoqtSessionTest, ReplyToAnnounceWithError) {
+TEST_F(MoqtSessionTest, ReplyToPublishNamespaceWithError) {
TrackNamespace track_namespace{"foo"};
std::unique_ptr<MoqtControlParserVisitor> stream_input =
MoqtSessionPeer::CreateControlStream(&session_, &mock_stream_);
auto parameters = std::make_optional<VersionSpecificParameters>(
AuthTokenType::kOutOfBand, "foo");
- MoqtAnnounce announce = {
+ MoqtPublishNamespace publish_namespace = {
kDefaultPeerRequestId,
track_namespace,
*parameters,
};
- MoqtAnnounceErrorReason error = {
+ MoqtPublishNamespaceErrorReason error = {
RequestErrorCode::kNotSupported,
"deadbeef",
};
- EXPECT_CALL(session_callbacks_.incoming_announce_callback,
+ EXPECT_CALL(session_callbacks_.incoming_publish_namespace_callback,
Call(track_namespace, parameters))
.WillOnce(Return(error));
EXPECT_CALL(
mock_stream_,
- Writev(SerializedControlMessage(MoqtAnnounceError{
+ Writev(SerializedControlMessage(MoqtPublishNamespaceError{
kDefaultPeerRequestId, error.error_code, error.reason_phrase}),
_));
- stream_input->OnAnnounceMessage(announce);
+ stream_input->OnPublishNamespaceMessage(publish_namespace);
}
TEST_F(MoqtSessionTest, SubscribeNamespaceLifeCycle) {
@@ -2741,7 +2746,7 @@
TrackNamespace track_namespace = TrackNamespace{"foo"};
auto parameters = std::make_optional<VersionSpecificParameters>(
AuthTokenType::kOutOfBand, "foo");
- MoqtSubscribeNamespace announces = {
+ MoqtSubscribeNamespace publish_namespaces = {
/*request_id=*/1,
track_namespace,
*parameters,
@@ -2749,27 +2754,27 @@
webtransport::test::MockStream control_stream;
std::unique_ptr<MoqtControlParserVisitor> stream_input =
MoqtSessionPeer::CreateControlStream(&session_, &control_stream);
- EXPECT_CALL(session_callbacks_.incoming_subscribe_announces_callback,
+ EXPECT_CALL(session_callbacks_.incoming_subscribe_namespace_callback,
Call(_, parameters))
.WillOnce(Return(std::nullopt));
EXPECT_CALL(
control_stream,
Writev(ControlMessageOfType(MoqtMessageType::kSubscribeNamespaceOk), _));
- stream_input->OnSubscribeNamespaceMessage(announces);
- MoqtUnsubscribeNamespace unsubscribe_announces = {
+ stream_input->OnSubscribeNamespaceMessage(publish_namespaces);
+ MoqtUnsubscribeNamespace ununsubscribe_namespaces = {
TrackNamespace{"foo"},
};
- EXPECT_CALL(session_callbacks_.incoming_subscribe_announces_callback,
+ EXPECT_CALL(session_callbacks_.incoming_subscribe_namespace_callback,
Call(track_namespace, std::optional<VersionSpecificParameters>()))
.WillOnce(Return(std::nullopt));
- stream_input->OnUnsubscribeNamespaceMessage(unsubscribe_announces);
+ stream_input->OnUnsubscribeNamespaceMessage(ununsubscribe_namespaces);
}
TEST_F(MoqtSessionTest, IncomingSubscribeNamespaceWithError) {
TrackNamespace track_namespace{"foo"};
auto parameters = std::make_optional<VersionSpecificParameters>(
AuthTokenType::kOutOfBand, "foo");
- MoqtSubscribeNamespace announces = {
+ MoqtSubscribeNamespace publish_namespaces = {
/*request_id=*/1,
track_namespace,
*parameters,
@@ -2777,7 +2782,7 @@
webtransport::test::MockStream control_stream;
std::unique_ptr<MoqtControlParserVisitor> stream_input =
MoqtSessionPeer::CreateControlStream(&session_, &control_stream);
- EXPECT_CALL(session_callbacks_.incoming_subscribe_announces_callback,
+ EXPECT_CALL(session_callbacks_.incoming_subscribe_namespace_callback,
Call(_, parameters))
.WillOnce(Return(
MoqtSubscribeErrorReason{RequestErrorCode::kUnauthorized, "foo"}));
@@ -2785,24 +2790,24 @@
control_stream,
Writev(ControlMessageOfType(MoqtMessageType::kSubscribeNamespaceError),
_));
- stream_input->OnSubscribeNamespaceMessage(announces);
+ stream_input->OnSubscribeNamespaceMessage(publish_namespaces);
// Try again, to verify that it was purged from the tree.
- announces.request_id += 2;
- EXPECT_CALL(session_callbacks_.incoming_subscribe_announces_callback,
+ publish_namespaces.request_id += 2;
+ EXPECT_CALL(session_callbacks_.incoming_subscribe_namespace_callback,
Call(_, parameters))
.WillOnce(Return(std::nullopt));
EXPECT_CALL(
control_stream,
Writev(ControlMessageOfType(MoqtMessageType::kSubscribeNamespaceOk), _));
- stream_input->OnSubscribeNamespaceMessage(announces);
+ stream_input->OnSubscribeNamespaceMessage(publish_namespaces);
}
TEST_F(MoqtSessionTest, IncomingSubscribeNamespaceWithPrefixOverlap) {
TrackNamespace track_namespace{"foo"};
auto parameters = std::make_optional<VersionSpecificParameters>(
AuthTokenType::kOutOfBand, "foo");
- MoqtSubscribeNamespace announces = {
+ MoqtSubscribeNamespace publish_namespaces = {
/*request_id=*/1,
track_namespace,
*parameters,
@@ -2810,41 +2815,41 @@
webtransport::test::MockStream control_stream;
std::unique_ptr<MoqtControlParserVisitor> stream_input =
MoqtSessionPeer::CreateControlStream(&session_, &control_stream);
- EXPECT_CALL(session_callbacks_.incoming_subscribe_announces_callback,
+ EXPECT_CALL(session_callbacks_.incoming_subscribe_namespace_callback,
Call(_, parameters))
.WillOnce(Return(std::nullopt));
EXPECT_CALL(
control_stream,
Writev(ControlMessageOfType(MoqtMessageType::kSubscribeNamespaceOk), _));
- stream_input->OnSubscribeNamespaceMessage(announces);
+ stream_input->OnSubscribeNamespaceMessage(publish_namespaces);
// Overlapping request is rejected.
- announces.request_id += 2;
- announces.track_namespace = TrackNamespace{"foo", "bar"};
+ publish_namespaces.request_id += 2;
+ publish_namespaces.track_namespace = TrackNamespace{"foo", "bar"};
EXPECT_CALL(
control_stream,
Writev(ControlMessageOfType(MoqtMessageType::kSubscribeNamespaceError),
_));
- stream_input->OnSubscribeNamespaceMessage(announces);
+ stream_input->OnSubscribeNamespaceMessage(publish_namespaces);
// Remove the subscription. Now a later one will work.
- MoqtUnsubscribeNamespace unsubscribe_announces = {
+ MoqtUnsubscribeNamespace ununsubscribe_namespaces = {
TrackNamespace{"foo"},
};
- EXPECT_CALL(session_callbacks_.incoming_subscribe_announces_callback,
+ EXPECT_CALL(session_callbacks_.incoming_subscribe_namespace_callback,
Call(track_namespace, std::optional<VersionSpecificParameters>()))
.WillOnce(Return(std::nullopt));
- stream_input->OnUnsubscribeNamespaceMessage(unsubscribe_announces);
+ stream_input->OnUnsubscribeNamespaceMessage(ununsubscribe_namespaces);
// Try again, it will work.
- announces.request_id += 2;
- EXPECT_CALL(session_callbacks_.incoming_subscribe_announces_callback,
+ publish_namespaces.request_id += 2;
+ EXPECT_CALL(session_callbacks_.incoming_subscribe_namespace_callback,
Call(_, parameters))
.WillOnce(Return(std::nullopt));
EXPECT_CALL(
control_stream,
Writev(ControlMessageOfType(MoqtMessageType::kSubscribeNamespaceOk), _));
- stream_input->OnSubscribeNamespaceMessage(announces);
+ stream_input->OnSubscribeNamespaceMessage(publish_namespaces);
}
TEST_F(MoqtSessionTest, FetchThenOkThenCancel) {
@@ -3411,10 +3416,10 @@
std::optional<RequestErrorCode> /*error*/,
absl::string_view /*reason*/) {},
VersionSpecificParameters()));
- session_.Announce(
+ session_.PublishNamespace(
TrackNamespace{"foo"},
+[](TrackNamespace /*track_namespace*/,
- std::optional<MoqtAnnounceErrorReason> /*error*/) {},
+ std::optional<MoqtPublishNamespaceErrorReason> /*error*/) {},
VersionSpecificParameters());
EXPECT_FALSE(session_.Fetch(
FullTrackName{TrackNamespace("foo"), "bar"},
@@ -3445,10 +3450,11 @@
mock_stream_,
Writev(ControlMessageOfType(MoqtMessageType::kSubscribeError), _));
stream_input->OnSubscribeMessage(DefaultSubscribe());
- EXPECT_CALL(mock_stream_,
- Writev(ControlMessageOfType(MoqtMessageType::kAnnounceError), _));
- stream_input->OnAnnounceMessage(
- MoqtAnnounce(3, TrackNamespace("foo"), VersionSpecificParameters()));
+ EXPECT_CALL(
+ mock_stream_,
+ Writev(ControlMessageOfType(MoqtMessageType::kPublishNamespaceError), _));
+ stream_input->OnPublishNamespaceMessage(MoqtPublishNamespace(
+ 3, TrackNamespace("foo"), VersionSpecificParameters()));
EXPECT_CALL(mock_stream_,
Writev(ControlMessageOfType(MoqtMessageType::kFetchError), _));
MoqtFetch fetch = DefaultFetch();
@@ -3465,7 +3471,7 @@
mock_stream_,
Writev(ControlMessageOfType(MoqtMessageType::kTrackStatusError), _));
stream_input->OnTrackStatusMessage(track_status);
- // Block all outgoing SUBSCRIBE, ANNOUNCE, GOAWAY,etc.
+ // Block all outgoing SUBSCRIBE, PUBLISH_NAMESPACE, GOAWAY,etc.
EXPECT_CALL(mock_stream_, Writev).Times(0);
MockSubscribeRemoteTrackVisitor remote_track_visitor;
EXPECT_FALSE(session_.SubscribeCurrentObject(
@@ -3477,10 +3483,10 @@
std::optional<RequestErrorCode> /*error*/,
absl::string_view /*reason*/) {},
VersionSpecificParameters()));
- session_.Announce(
+ session_.PublishNamespace(
TrackNamespace{"foo"},
+[](TrackNamespace /*track_namespace*/,
- std::optional<MoqtAnnounceErrorReason> /*error*/) {},
+ std::optional<MoqtPublishNamespaceErrorReason> /*error*/) {},
VersionSpecificParameters());
EXPECT_FALSE(session_.Fetch(
FullTrackName(TrackNamespace("foo"), "bar"),
diff --git a/quiche/quic/moqt/test_tools/moqt_framer_utils.cc b/quiche/quic/moqt/test_tools/moqt_framer_utils.cc
index 8643c12..6073b87 100644
--- a/quiche/quic/moqt/test_tools/moqt_framer_utils.cc
+++ b/quiche/quic/moqt/test_tools/moqt_framer_utils.cc
@@ -50,20 +50,20 @@
quiche::QuicheBuffer operator()(const MoqtSubscribeUpdate& message) {
return framer.SerializeSubscribeUpdate(message);
}
- quiche::QuicheBuffer operator()(const MoqtAnnounce& message) {
- return framer.SerializeAnnounce(message);
+ quiche::QuicheBuffer operator()(const MoqtPublishNamespace& message) {
+ return framer.SerializePublishNamespace(message);
}
- quiche::QuicheBuffer operator()(const MoqtAnnounceOk& message) {
- return framer.SerializeAnnounceOk(message);
+ quiche::QuicheBuffer operator()(const MoqtPublishNamespaceOk& message) {
+ return framer.SerializePublishNamespaceOk(message);
}
- quiche::QuicheBuffer operator()(const MoqtAnnounceError& message) {
- return framer.SerializeAnnounceError(message);
+ quiche::QuicheBuffer operator()(const MoqtPublishNamespaceError& message) {
+ return framer.SerializePublishNamespaceError(message);
}
- quiche::QuicheBuffer operator()(const MoqtUnannounce& message) {
- return framer.SerializeUnannounce(message);
+ quiche::QuicheBuffer operator()(const MoqtPublishNamespaceDone& message) {
+ return framer.SerializePublishNamespaceDone(message);
}
- quiche::QuicheBuffer operator()(const MoqtAnnounceCancel& message) {
- return framer.SerializeAnnounceCancel(message);
+ quiche::QuicheBuffer operator()(const MoqtPublishNamespaceCancel& message) {
+ return framer.SerializePublishNamespaceCancel(message);
}
quiche::QuicheBuffer operator()(const MoqtTrackStatus& message) {
return framer.SerializeTrackStatus(message);
@@ -153,19 +153,21 @@
void OnSubscribeUpdateMessage(const MoqtSubscribeUpdate& message) {
frames_.push_back(message);
}
- void OnAnnounceMessage(const MoqtAnnounce& message) {
+ void OnPublishNamespaceMessage(const MoqtPublishNamespace& message) {
frames_.push_back(message);
}
- void OnAnnounceOkMessage(const MoqtAnnounceOk& message) {
+ void OnPublishNamespaceOkMessage(const MoqtPublishNamespaceOk& message) {
frames_.push_back(message);
}
- void OnAnnounceErrorMessage(const MoqtAnnounceError& message) {
+ void OnPublishNamespaceErrorMessage(
+ const MoqtPublishNamespaceError& message) {
frames_.push_back(message);
}
- void OnUnannounceMessage(const MoqtUnannounce& message) {
+ void OnPublishNamespaceDoneMessage(const MoqtPublishNamespaceDone& message) {
frames_.push_back(message);
}
- void OnAnnounceCancelMessage(const MoqtAnnounceCancel& message) {
+ void OnPublishNamespaceCancelMessage(
+ const MoqtPublishNamespaceCancel& message) {
frames_.push_back(message);
}
void OnTrackStatusMessage(const MoqtTrackStatus& message) {
diff --git a/quiche/quic/moqt/test_tools/moqt_framer_utils.h b/quiche/quic/moqt/test_tools/moqt_framer_utils.h
index b0e05d7..57e0d5b 100644
--- a/quiche/quic/moqt/test_tools/moqt_framer_utils.h
+++ b/quiche/quic/moqt/test_tools/moqt_framer_utils.h
@@ -28,9 +28,9 @@
using MoqtGenericFrame = std::variant<
MoqtClientSetup, MoqtServerSetup, MoqtSubscribe, MoqtSubscribeOk,
MoqtSubscribeError, MoqtUnsubscribe, MoqtPublishDone, MoqtSubscribeUpdate,
- MoqtAnnounce, MoqtAnnounceOk, MoqtAnnounceError, MoqtUnannounce,
- MoqtAnnounceCancel, MoqtTrackStatus, MoqtTrackStatusOk,
- MoqtTrackStatusError, MoqtGoAway, MoqtSubscribeNamespace,
+ MoqtPublishNamespace, MoqtPublishNamespaceOk, MoqtPublishNamespaceError,
+ MoqtPublishNamespaceDone, MoqtPublishNamespaceCancel, MoqtTrackStatus,
+ MoqtTrackStatusOk, MoqtTrackStatusError, MoqtGoAway, MoqtSubscribeNamespace,
MoqtSubscribeNamespaceOk, MoqtSubscribeNamespaceError,
MoqtUnsubscribeNamespace, MoqtMaxRequestId, MoqtFetch, MoqtFetchCancel,
MoqtFetchOk, MoqtFetchError, MoqtRequestsBlocked, MoqtPublish,
diff --git a/quiche/quic/moqt/test_tools/moqt_parser_test_visitor.h b/quiche/quic/moqt/test_tools/moqt_parser_test_visitor.h
index be6f3b2..6998d98 100644
--- a/quiche/quic/moqt/test_tools/moqt_parser_test_visitor.h
+++ b/quiche/quic/moqt/test_tools/moqt_parser_test_visitor.h
@@ -66,19 +66,23 @@
void OnPublishDoneMessage(const MoqtPublishDone& message) override {
OnControlMessage(message);
}
- void OnAnnounceMessage(const MoqtAnnounce& message) override {
+ void OnPublishNamespaceMessage(const MoqtPublishNamespace& message) override {
OnControlMessage(message);
}
- void OnAnnounceOkMessage(const MoqtAnnounceOk& message) override {
+ void OnPublishNamespaceOkMessage(
+ const MoqtPublishNamespaceOk& message) override {
OnControlMessage(message);
}
- void OnAnnounceErrorMessage(const MoqtAnnounceError& message) override {
+ void OnPublishNamespaceErrorMessage(
+ const MoqtPublishNamespaceError& message) override {
OnControlMessage(message);
}
- void OnUnannounceMessage(const MoqtUnannounce& message) override {
+ void OnPublishNamespaceDoneMessage(
+ const MoqtPublishNamespaceDone& message) override {
OnControlMessage(message);
}
- void OnAnnounceCancelMessage(const MoqtAnnounceCancel& message) override {
+ void OnPublishNamespaceCancelMessage(
+ const MoqtPublishNamespaceCancel& message) override {
OnControlMessage(message);
}
void OnTrackStatusMessage(const MoqtTrackStatus& message) override {
diff --git a/quiche/quic/moqt/test_tools/moqt_simulator_harness.cc b/quiche/quic/moqt/test_tools/moqt_simulator_harness.cc
index 9c743eb..b124720 100644
--- a/quiche/quic/moqt/test_tools/moqt_simulator_harness.cc
+++ b/quiche/quic/moqt/test_tools/moqt_simulator_harness.cc
@@ -39,7 +39,7 @@
MoqtSessionCallbacks CreateCallbacks(quic::simulator::Simulator* simulator) {
return MoqtSessionCallbacks(
+[] {}, +[](absl::string_view) {}, +[](absl::string_view) {}, +[] {},
- DefaultIncomingAnnounceCallback,
+ DefaultIncomingPublishNamespaceCallback,
DefaultIncomingSubscribeNamespaceCallback, simulator->GetClock());
}
} // namespace
diff --git a/quiche/quic/moqt/test_tools/moqt_test_message.h b/quiche/quic/moqt/test_tools/moqt_test_message.h
index 13126e4..2af6e2b 100644
--- a/quiche/quic/moqt/test_tools/moqt_test_message.h
+++ b/quiche/quic/moqt/test_tools/moqt_test_message.h
@@ -69,16 +69,18 @@
public:
virtual ~TestMessageBase() = default;
- using MessageStructuredData = std::variant<
- MoqtClientSetup, MoqtServerSetup, MoqtObject, MoqtSubscribe,
- MoqtSubscribeOk, MoqtSubscribeError, MoqtUnsubscribe, MoqtPublishDone,
- MoqtSubscribeUpdate, MoqtAnnounce, MoqtAnnounceOk, MoqtAnnounceError,
- MoqtUnannounce, MoqtAnnounceCancel, MoqtTrackStatus, MoqtTrackStatusOk,
- MoqtTrackStatusError, MoqtGoAway, MoqtSubscribeNamespace,
- MoqtSubscribeNamespaceOk, MoqtSubscribeNamespaceError,
- MoqtUnsubscribeNamespace, MoqtMaxRequestId, MoqtFetch, MoqtFetchCancel,
- MoqtFetchOk, MoqtFetchError, MoqtRequestsBlocked, MoqtPublish,
- MoqtPublishOk, MoqtPublishError, MoqtObjectAck>;
+ using MessageStructuredData =
+ std::variant<MoqtClientSetup, MoqtServerSetup, MoqtObject, MoqtSubscribe,
+ MoqtSubscribeOk, MoqtSubscribeError, MoqtUnsubscribe,
+ MoqtPublishDone, MoqtSubscribeUpdate, MoqtPublishNamespace,
+ MoqtPublishNamespaceOk, MoqtPublishNamespaceError,
+ MoqtPublishNamespaceDone, MoqtPublishNamespaceCancel,
+ MoqtTrackStatus, MoqtTrackStatusOk, MoqtTrackStatusError,
+ MoqtGoAway, MoqtSubscribeNamespace, MoqtSubscribeNamespaceOk,
+ MoqtSubscribeNamespaceError, MoqtUnsubscribeNamespace,
+ MoqtMaxRequestId, MoqtFetch, MoqtFetchCancel, MoqtFetchOk,
+ MoqtFetchError, MoqtRequestsBlocked, MoqtPublish,
+ MoqtPublishOk, MoqtPublishError, MoqtObjectAck>;
// The total actual size of the message.
size_t total_message_size() const { return wire_image_size_; }
@@ -969,24 +971,24 @@
};
};
-class QUICHE_NO_EXPORT AnnounceMessage : public TestMessageBase {
+class QUICHE_NO_EXPORT PublishNamespaceMessage : public TestMessageBase {
public:
- AnnounceMessage() : TestMessageBase() {
+ PublishNamespaceMessage() : TestMessageBase() {
SetWireImage(raw_packet_, sizeof(raw_packet_));
}
bool EqualFieldValues(MessageStructuredData& values) const override {
- auto cast = std::get<MoqtAnnounce>(values);
- if (cast.request_id != announce_.request_id) {
- QUIC_LOG(INFO) << "ANNOUNCE request ID mismatch";
+ auto cast = std::get<MoqtPublishNamespace>(values);
+ if (cast.request_id != publish_namespace_.request_id) {
+ QUIC_LOG(INFO) << "PUBLISH_NAMESPACE request ID mismatch";
return false;
}
- if (cast.track_namespace != announce_.track_namespace) {
- QUIC_LOG(INFO) << "ANNOUNCE track namespace mismatch";
+ if (cast.track_namespace != publish_namespace_.track_namespace) {
+ QUIC_LOG(INFO) << "PUBLISH_NAMESPACE track namespace mismatch";
return false;
}
- if (cast.parameters != announce_.parameters) {
- QUIC_LOG(INFO) << "ANNOUNCE parameter mismatch";
+ if (cast.parameters != publish_namespace_.parameters) {
+ QUIC_LOG(INFO) << "PUBLISH_NAMESPACE parameter mismatch";
return false;
}
return true;
@@ -995,7 +997,7 @@
void ExpandVarints() override { ExpandVarintsImpl("vvv---vvv-----"); }
MessageStructuredData structured_data() const override {
- return TestMessageBase::MessageStructuredData(announce_);
+ return TestMessageBase::MessageStructuredData(publish_namespace_);
}
private:
@@ -1006,23 +1008,23 @@
0x03, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72, // authorization_tag = "bar"
};
- MoqtAnnounce announce_ = {
+ MoqtPublishNamespace publish_namespace_ = {
/*request_id=*/2,
TrackNamespace{"foo"},
VersionSpecificParameters(AuthTokenType::kOutOfBand, "bar"),
};
};
-class QUICHE_NO_EXPORT AnnounceOkMessage : public TestMessageBase {
+class QUICHE_NO_EXPORT PublishNamespaceOkMessage : public TestMessageBase {
public:
- AnnounceOkMessage() : TestMessageBase() {
+ PublishNamespaceOkMessage() : TestMessageBase() {
SetWireImage(raw_packet_, sizeof(raw_packet_));
}
bool EqualFieldValues(MessageStructuredData& values) const override {
- auto cast = std::get<MoqtAnnounceOk>(values);
- if (cast.request_id != announce_ok_.request_id) {
- QUIC_LOG(INFO) << "ANNOUNCE OK MESSAGE request ID mismatch";
+ auto cast = std::get<MoqtPublishNamespaceOk>(values);
+ if (cast.request_id != publish_namespace_ok_.request_id) {
+ QUIC_LOG(INFO) << "PUBLISH_NAMESPACE OK MESSAGE request ID mismatch";
return false;
}
return true;
@@ -1031,7 +1033,7 @@
void ExpandVarints() override { ExpandVarintsImpl("v"); }
MessageStructuredData structured_data() const override {
- return TestMessageBase::MessageStructuredData(announce_ok_);
+ return TestMessageBase::MessageStructuredData(publish_namespace_ok_);
}
private:
@@ -1039,29 +1041,29 @@
0x07, 0x00, 0x01, 0x01, // request_id = 1
};
- MoqtAnnounceOk announce_ok_ = {
+ MoqtPublishNamespaceOk publish_namespace_ok_ = {
/*request_id=*/1,
};
};
-class QUICHE_NO_EXPORT AnnounceErrorMessage : public TestMessageBase {
+class QUICHE_NO_EXPORT PublishNamespaceErrorMessage : public TestMessageBase {
public:
- AnnounceErrorMessage() : TestMessageBase() {
+ PublishNamespaceErrorMessage() : TestMessageBase() {
SetWireImage(raw_packet_, sizeof(raw_packet_));
}
bool EqualFieldValues(MessageStructuredData& values) const override {
- auto cast = std::get<MoqtAnnounceError>(values);
- if (cast.request_id != announce_error_.request_id) {
- QUIC_LOG(INFO) << "ANNOUNCE_ERROR request ID mismatch";
+ auto cast = std::get<MoqtPublishNamespaceError>(values);
+ if (cast.request_id != publish_namespace_error_.request_id) {
+ QUIC_LOG(INFO) << "PUBLISH_NAMESPACE_ERROR request ID mismatch";
return false;
}
- if (cast.error_code != announce_error_.error_code) {
- QUIC_LOG(INFO) << "ANNOUNCE_ERROR error code mismatch";
+ if (cast.error_code != publish_namespace_error_.error_code) {
+ QUIC_LOG(INFO) << "PUBLISH_NAMESPACE_ERROR error code mismatch";
return false;
}
- if (cast.error_reason != announce_error_.error_reason) {
- QUIC_LOG(INFO) << "ANNOUNCE_ERROR error reason mismatch";
+ if (cast.error_reason != publish_namespace_error_.error_reason) {
+ QUIC_LOG(INFO) << "PUBLISH_NAMESPACE_ERROR error reason mismatch";
return false;
}
return true;
@@ -1070,7 +1072,7 @@
void ExpandVarints() override { ExpandVarintsImpl("vvv---"); }
MessageStructuredData structured_data() const override {
- return TestMessageBase::MessageStructuredData(announce_error_);
+ return TestMessageBase::MessageStructuredData(publish_namespace_error_);
}
private:
@@ -1080,23 +1082,23 @@
0x03, 0x62, 0x61, 0x72, // reason_phrase = "bar"
};
- MoqtAnnounceError announce_error_ = {
+ MoqtPublishNamespaceError publish_namespace_error_ = {
/*request_id=*/1,
RequestErrorCode::kNotSupported,
/*reason_phrase=*/"bar",
};
};
-class QUICHE_NO_EXPORT UnannounceMessage : public TestMessageBase {
+class QUICHE_NO_EXPORT PublishNamespaceDoneMessage : public TestMessageBase {
public:
- UnannounceMessage() : TestMessageBase() {
+ PublishNamespaceDoneMessage() : TestMessageBase() {
SetWireImage(raw_packet_, sizeof(raw_packet_));
}
bool EqualFieldValues(MessageStructuredData& values) const override {
- auto cast = std::get<MoqtUnannounce>(values);
- if (cast.track_namespace != unannounce_.track_namespace) {
- QUIC_LOG(INFO) << "UNANNOUNCE track namespace mismatch";
+ auto cast = std::get<MoqtPublishNamespaceDone>(values);
+ if (cast.track_namespace != publish_namespace_done_.track_namespace) {
+ QUIC_LOG(INFO) << "PUBLISH_NAMESPACE_DONE track namespace mismatch";
return false;
}
return true;
@@ -1105,7 +1107,7 @@
void ExpandVarints() override { ExpandVarintsImpl("vv---"); }
MessageStructuredData structured_data() const override {
- return TestMessageBase::MessageStructuredData(unannounce_);
+ return TestMessageBase::MessageStructuredData(publish_namespace_done_);
}
private:
@@ -1113,29 +1115,29 @@
0x09, 0x00, 0x05, 0x01, 0x03, 0x66, 0x6f, 0x6f, // track_namespace
};
- MoqtUnannounce unannounce_ = {
+ MoqtPublishNamespaceDone publish_namespace_done_ = {
TrackNamespace("foo"),
};
};
-class QUICHE_NO_EXPORT AnnounceCancelMessage : public TestMessageBase {
+class QUICHE_NO_EXPORT PublishNamespaceCancelMessage : public TestMessageBase {
public:
- AnnounceCancelMessage() : TestMessageBase() {
+ PublishNamespaceCancelMessage() : TestMessageBase() {
SetWireImage(raw_packet_, sizeof(raw_packet_));
}
bool EqualFieldValues(MessageStructuredData& values) const override {
- auto cast = std::get<MoqtAnnounceCancel>(values);
- if (cast.track_namespace != announce_cancel_.track_namespace) {
- QUIC_LOG(INFO) << "ANNOUNCE CANCEL track namespace mismatch";
+ auto cast = std::get<MoqtPublishNamespaceCancel>(values);
+ if (cast.track_namespace != publish_namespace_cancel_.track_namespace) {
+ QUIC_LOG(INFO) << "PUBLISH_NAMESPACE CANCEL track namespace mismatch";
return false;
}
- if (cast.error_code != announce_cancel_.error_code) {
- QUIC_LOG(INFO) << "ANNOUNCE CANCEL error code mismatch";
+ if (cast.error_code != publish_namespace_cancel_.error_code) {
+ QUIC_LOG(INFO) << "PUBLISH_NAMESPACE CANCEL error code mismatch";
return false;
}
- if (cast.error_reason != announce_cancel_.error_reason) {
- QUIC_LOG(INFO) << "ANNOUNCE CANCEL reason phrase mismatch";
+ if (cast.error_reason != publish_namespace_cancel_.error_reason) {
+ QUIC_LOG(INFO) << "PUBLISH_NAMESPACE CANCEL reason phrase mismatch";
return false;
}
return true;
@@ -1144,7 +1146,7 @@
void ExpandVarints() override { ExpandVarintsImpl("vv---vv---"); }
MessageStructuredData structured_data() const override {
- return TestMessageBase::MessageStructuredData(announce_cancel_);
+ return TestMessageBase::MessageStructuredData(publish_namespace_cancel_);
}
private:
@@ -1155,7 +1157,7 @@
0x03, 0x62, 0x61, 0x72, // error_reason = "bar"
};
- MoqtAnnounceCancel announce_cancel_ = {
+ MoqtPublishNamespaceCancel publish_namespace_cancel_ = {
TrackNamespace("foo"),
RequestErrorCode::kNotSupported,
/*error_reason=*/"bar",
@@ -2061,16 +2063,16 @@
return std::make_unique<PublishDoneMessage>();
case MoqtMessageType::kSubscribeUpdate:
return std::make_unique<SubscribeUpdateMessage>();
- case MoqtMessageType::kAnnounce:
- return std::make_unique<AnnounceMessage>();
- case MoqtMessageType::kAnnounceOk:
- return std::make_unique<AnnounceOkMessage>();
- case MoqtMessageType::kAnnounceError:
- return std::make_unique<AnnounceErrorMessage>();
- case MoqtMessageType::kUnannounce:
- return std::make_unique<UnannounceMessage>();
- case MoqtMessageType::kAnnounceCancel:
- return std::make_unique<AnnounceCancelMessage>();
+ case MoqtMessageType::kPublishNamespace:
+ return std::make_unique<PublishNamespaceMessage>();
+ case MoqtMessageType::kPublishNamespaceOk:
+ return std::make_unique<PublishNamespaceOkMessage>();
+ case MoqtMessageType::kPublishNamespaceError:
+ return std::make_unique<PublishNamespaceErrorMessage>();
+ case MoqtMessageType::kPublishNamespaceDone:
+ return std::make_unique<PublishNamespaceDoneMessage>();
+ case MoqtMessageType::kPublishNamespaceCancel:
+ return std::make_unique<PublishNamespaceCancelMessage>();
case MoqtMessageType::kTrackStatus:
return std::make_unique<TrackStatusMessage>();
case MoqtMessageType::kTrackStatusOk:
diff --git a/quiche/quic/moqt/tools/chat_client.cc b/quiche/quic/moqt/tools/chat_client.cc
index 1bfb70e..ab6f73c 100644
--- a/quiche/quic/moqt/tools/chat_client.cc
+++ b/quiche/quic/moqt/tools/chat_client.cc
@@ -27,6 +27,7 @@
#include "quiche/quic/moqt/moqt_priority.h"
#include "quiche/quic/moqt/moqt_publisher.h"
#include "quiche/quic/moqt/moqt_session.h"
+#include "quiche/quic/moqt/moqt_session_interface.h"
#include "quiche/quic/moqt/tools/moq_chat.h"
#include "quiche/quic/moqt/tools/moqt_client.h"
#include "quiche/quic/platform/api/quic_default_proof_providers.h"
@@ -39,35 +40,37 @@
namespace moqt::moq_chat {
-std::optional<MoqtAnnounceErrorReason> ChatClient::OnIncomingAnnounce(
+std::optional<MoqtPublishNamespaceErrorReason>
+ChatClient::OnIncomingPublishNamespace(
const moqt::TrackNamespace& track_namespace,
std::optional<VersionSpecificParameters> parameters) {
if (track_namespace == GetUserNamespace(my_track_name_)) {
- // Ignore ANNOUNCE for my own track.
- return std::optional<MoqtAnnounceErrorReason>();
+ // Ignore PUBLISH_NAMESPACE for my own track.
+ return std::optional<MoqtPublishNamespaceErrorReason>();
}
std::optional<FullTrackName> track_name = ConstructTrackNameFromNamespace(
track_namespace, GetChatId(my_track_name_));
if (!parameters.has_value()) {
- std::cout << "UNANNOUNCE for " << track_namespace.ToString() << "\n";
+ std::cout << "PUBLISH_NAMESPACE_DONE for " << track_namespace.ToString()
+ << "\n";
if (track_name.has_value() && other_users_.contains(*track_name)) {
session_->Unsubscribe(*track_name);
other_users_.erase(*track_name);
}
return std::nullopt;
}
- std::cout << "ANNOUNCE for " << track_namespace.ToString() << "\n";
+ std::cout << "PUBLISH_NAMESPACE for " << track_namespace.ToString() << "\n";
if (!track_name.has_value()) {
- std::cout << "ANNOUNCE rejected, invalid namespace\n";
- return std::make_optional<MoqtAnnounceErrorReason>(
+ std::cout << "PUBLISH_NAMESPACE rejected, invalid namespace\n";
+ return std::make_optional<MoqtPublishNamespaceErrorReason>(
RequestErrorCode::kTrackDoesNotExist, "Not a subscribed namespace");
}
if (other_users_.contains(*track_name)) {
- std::cout << "Duplicate ANNOUNCE, send OK and ignore\n";
+ std::cout << "Duplicate PUBLISH_NAMESPACE, send OK and ignore\n";
return std::nullopt;
}
if (GetUsername(my_track_name_) == GetUsername(*track_name)) {
- std::cout << "ANNOUNCE for a previous instance of my track, "
+ std::cout << "PUBLISH_NAMESPACE for a previous instance of my track, "
"do not subscribe\n";
return std::nullopt;
}
@@ -78,7 +81,7 @@
++subscribes_to_make_;
other_users_.emplace(*track_name);
}
- return std::nullopt; // Send ANNOUNCE_OK.
+ return std::nullopt; // Send PUBLISH_NAMESPACE_OK.
}
ChatClient::ChatClient(const quic::QuicServerId& server_id,
@@ -128,8 +131,8 @@
session_callbacks_.session_deleted_callback = [this]() {
session_ = nullptr;
};
- session_callbacks_.incoming_announce_callback =
- absl::bind_front(&ChatClient::OnIncomingAnnounce, this);
+ session_callbacks_.incoming_publish_namespace_callback =
+ absl::bind_front(&ChatClient::OnIncomingPublishNamespace, this);
interface_->Initialize(
[this](absl::string_view input_message) {
OnTerminalLineInput(input_message);
@@ -150,9 +153,9 @@
return;
}
if (input_message == "/exit") {
- // Clean teardown of SUBSCRIBE_NAMESPACE, ANNOUNCE, SUBSCRIBE.
+ // Clean teardown of SUBSCRIBE_NAMESPACE, PUBLISH_NAMESPACE, SUBSCRIBE.
session_->UnsubscribeNamespace(GetChatNamespace(my_track_name_));
- session_->Unannounce(GetUserNamespace(my_track_name_));
+ session_->PublishNamespaceDone(GetUserNamespace(my_track_name_));
for (const auto& track_name : other_users_) {
session_->Unsubscribe(track_name);
}
@@ -205,7 +208,7 @@
client_->WriteToOutput(GetUsername(*it), object);
}
-bool ChatClient::AnnounceAndSubscribeNamespace() {
+bool ChatClient::PublishNamespaceAndSubscribeNamespace() {
session_ = client_->session();
if (session_ == nullptr) {
std::cout << "Failed to connect.\n";
@@ -217,26 +220,29 @@
my_track_name_, MoqtForwardingPreference::kSubgroup);
publisher_.Add(queue_);
session_->set_publisher(&publisher_);
- MoqtOutgoingAnnounceCallback announce_callback =
+ MoqtOutgoingPublishNamespaceCallback publish_namespace_callback =
[this](TrackNamespace track_namespace,
- std::optional<MoqtAnnounceErrorReason> reason) {
+ std::optional<MoqtPublishNamespaceErrorReason> reason) {
if (reason.has_value()) {
- std::cout << "ANNOUNCE rejected, " << reason->reason_phrase << "\n";
- session_->Error(MoqtError::kInternalError, "Local ANNOUNCE rejected");
+ std::cout << "PUBLISH_NAMESPACE rejected, " << reason->reason_phrase
+ << "\n";
+ session_->Error(MoqtError::kInternalError,
+ "Local PUBLISH_NAMESPACE rejected");
return;
}
- std::cout << "ANNOUNCE for " << track_namespace.ToString()
+ std::cout << "PUBLISH_NAMESPACE for " << track_namespace.ToString()
<< " accepted\n";
return;
};
std::cout << "Announcing " << GetUserNamespace(my_track_name_).ToString()
<< "\n";
- session_->Announce(GetUserNamespace(my_track_name_),
- std::move(announce_callback), VersionSpecificParameters());
+ session_->PublishNamespace(GetUserNamespace(my_track_name_),
+ std::move(publish_namespace_callback),
+ VersionSpecificParameters());
- // Send SUBSCRIBE_ANNOUNCE. Pop 3 levels of namespace to get to {moq-chat,
- // chat-id}
- MoqtOutgoingSubscribeNamespaceCallback subscribe_announces_callback =
+ // Send SUBSCRIBE_NAMESPACE. Pop 3 levels of namespace to get to
+ // {moq-chat, chat-id}
+ MoqtOutgoingSubscribeNamespaceCallback subscribe_namespace_callback =
[this](TrackNamespace track_namespace,
std::optional<RequestErrorCode> error, absl::string_view reason) {
if (error.has_value()) {
@@ -252,7 +258,7 @@
VersionSpecificParameters parameters(
AuthTokenType::kOutOfBand, std::string(GetUsername(my_track_name_)));
session_->SubscribeNamespace(GetChatNamespace(my_track_name_),
- std::move(subscribe_announces_callback),
+ std::move(subscribe_namespace_callback),
parameters);
while (session_is_open_ && is_syncing()) {
diff --git a/quiche/quic/moqt/tools/chat_client.h b/quiche/quic/moqt/tools/chat_client.h
index fcb9981..85becbf 100644
--- a/quiche/quic/moqt/tools/chat_client.h
+++ b/quiche/quic/moqt/tools/chat_client.h
@@ -112,7 +112,7 @@
};
// Returns false on error.
- bool AnnounceAndSubscribeNamespace();
+ bool PublishNamespaceAndSubscribeNamespace();
bool session_is_open() const { return session_is_open_; }
@@ -126,8 +126,8 @@
private:
void RunEventLoop() { event_loop_->RunEventLoopOnce(kChatEventLoopDuration); }
- // Callback for incoming announces.
- std::optional<MoqtAnnounceErrorReason> OnIncomingAnnounce(
+ // Callback for incoming publish_namespaces.
+ std::optional<MoqtPublishNamespaceErrorReason> OnIncomingPublishNamespace(
const moqt::TrackNamespace& track_namespace,
std::optional<VersionSpecificParameters> parameters);
@@ -150,7 +150,7 @@
absl::flat_hash_set<FullTrackName> other_users_;
int subscribes_to_make_ = 0;
- // Related to subscriptions/announces
+ // Related to subscriptions/publish_namespaces
// TODO: One for each subscribe
RemoteTrackVisitor remote_track_visitor_;
diff --git a/quiche/quic/moqt/tools/chat_client_bin.cc b/quiche/quic/moqt/tools/chat_client_bin.cc
index e627ea4..c391c8c 100644
--- a/quiche/quic/moqt/tools/chat_client_bin.cc
+++ b/quiche/quic/moqt/tools/chat_client_bin.cc
@@ -152,7 +152,7 @@
if (!client.Connect(path)) {
return 1;
}
- if (!client.AnnounceAndSubscribeNamespace()) {
+ if (!client.PublishNamespaceAndSubscribeNamespace()) {
return 1;
}
client.IoLoop();
diff --git a/quiche/quic/moqt/tools/chat_server.cc b/quiche/quic/moqt/tools/chat_server.cc
index 4c64466..fa7d5d4 100644
--- a/quiche/quic/moqt/tools/chat_server.cc
+++ b/quiche/quic/moqt/tools/chat_server.cc
@@ -26,32 +26,34 @@
namespace moqt::moq_chat {
-std::optional<MoqtAnnounceErrorReason>
-ChatServer::ChatServerSessionHandler::OnIncomingAnnounce(
+std::optional<MoqtPublishNamespaceErrorReason>
+ChatServer::ChatServerSessionHandler::OnIncomingPublishNamespace(
const moqt::TrackNamespace& track_namespace,
std::optional<VersionSpecificParameters> parameters) {
if (track_name_.has_value() &&
GetUserNamespace(*track_name_) != track_namespace) {
// ChatServer only supports one track per client session at a time. Return
- // ANNOUNCE_OK and exit.
+ // PUBLISH_NAMESPACE_OK and exit.
return std::nullopt;
}
- // Accept the ANNOUNCE regardless of the chat_id.
+ // Accept the PUBLISH_NAMESPACE regardless of the chat_id.
track_name_ = ConstructTrackNameFromNamespace(track_namespace,
GetChatId(track_namespace));
if (!track_name_.has_value()) {
- std::cout << "Malformed ANNOUNCE namespace\n";
- return MoqtAnnounceErrorReason(RequestErrorCode::kTrackDoesNotExist,
- "Not a valid namespace for this chat.");
+ std::cout << "Malformed PUBLISH_NAMESPACE namespace\n";
+ return MoqtPublishNamespaceErrorReason(
+ RequestErrorCode::kTrackDoesNotExist,
+ "Not a valid namespace for this chat.");
}
if (!parameters.has_value()) {
- std::cout << "Received UNANNOUNCE for " << track_namespace.ToString()
- << "\n";
+ std::cout << "Received PUBLISH_NAMESPACE_DONE for "
+ << track_namespace.ToString() << "\n";
server_->DeleteUser(*track_name_);
track_name_.reset();
return std::nullopt;
}
- std::cout << "Received ANNOUNCE for " << track_namespace.ToString() << "\n";
+ std::cout << "Received PUBLISH_NAMESPACE for " << track_namespace.ToString()
+ << "\n";
session_->SubscribeCurrentObject(*track_name_,
server_->remote_track_visitor(),
moqt::VersionSpecificParameters());
@@ -59,11 +61,11 @@
return std::nullopt;
}
-void ChatServer::ChatServerSessionHandler::OnOutgoingAnnounceReply(
+void ChatServer::ChatServerSessionHandler::OnOutgoingPublishNamespaceReply(
TrackNamespace track_namespace,
- std::optional<MoqtAnnounceErrorReason> error_message) {
+ std::optional<MoqtPublishNamespaceErrorReason> error_message) {
// Log the result; the server doesn't really care.
- std::cout << "ANNOUNCE for " << track_namespace.ToString();
+ std::cout << "PUBLISH_NAMESPACE for " << track_namespace.ToString();
if (error_message.has_value()) {
std::cout << " failed with error: " << error_message->reason_phrase << "\n";
} else {
@@ -74,8 +76,8 @@
ChatServer::ChatServerSessionHandler::ChatServerSessionHandler(
MoqtSession* session, ChatServer* server)
: session_(session), server_(server) {
- session_->callbacks().incoming_announce_callback = absl::bind_front(
- &ChatServer::ChatServerSessionHandler::OnIncomingAnnounce, this);
+ session_->callbacks().incoming_publish_namespace_callback = absl::bind_front(
+ &ChatServer::ChatServerSessionHandler::OnIncomingPublishNamespace, this);
session_->callbacks().session_terminated_callback =
[this](absl::string_view error_message) {
std::cout << "Session terminated, reason = " << error_message << "\n";
@@ -84,7 +86,7 @@
server_->DeleteUser(*track_name_);
}
};
- session_->callbacks().incoming_subscribe_announces_callback =
+ session_->callbacks().incoming_subscribe_namespace_callback =
[this](const moqt::TrackNamespace& chat_namespace,
std::optional<VersionSpecificParameters> parameters) {
if (parameters.has_value()) {
@@ -104,19 +106,19 @@
if (!parameters.has_value()) {
return std::optional<MoqtSubscribeErrorReason>();
}
- // Send all ANNOUNCE.
+ // Send all PUBLISH_NAMESPACE.
for (auto& [track_name, queue] : server_->user_queues_) {
- std::cout << "Sending ANNOUNCE for "
+ std::cout << "Sending PUBLISH_NAMESPACE for "
<< GetUserNamespace(track_name).ToString() << "\n";
if (track_name_.has_value() &&
GetUsername(*track_name_) == GetUsername(track_name)) {
- // Don't ANNOUNCE a client to itself.
+ // Don't PUBLISH_NAMESPACE a client to itself.
continue;
}
- session_->Announce(
+ session_->PublishNamespace(
GetUserNamespace(track_name),
absl::bind_front(&ChatServer::ChatServerSessionHandler::
- OnOutgoingAnnounceReply,
+ OnOutgoingPublishNamespaceReply,
this),
moqt::VersionSpecificParameters());
}
@@ -202,7 +204,7 @@
MoqtDeliveryOrder::kAscending, quic::QuicTime::Infinite());
publisher_.Add(user_queues_[track_name]);
for (auto& session : sessions_) {
- session.AnnounceIfSubscribed(track_name.track_namespace());
+ session.PublishNamespaceIfSubscribed(track_name.track_namespace());
}
}
@@ -216,7 +218,7 @@
publisher_.Delete(track_name);
TrackNamespace track_namespace = GetUserNamespace(track_name);
for (auto& session : sessions_) {
- session.UnannounceIfSubscribed(track_namespace);
+ session.PublishNamespaceDoneIfSubscribed(track_namespace);
}
if (user_queues_.empty()) {
std::cout << "No more users!\n";
diff --git a/quiche/quic/moqt/tools/chat_server.h b/quiche/quic/moqt/tools/chat_server.h
index 468845f..971e49e 100644
--- a/quiche/quic/moqt/tools/chat_server.h
+++ b/quiche/quic/moqt/tools/chat_server.h
@@ -64,14 +64,14 @@
it_ = it;
}
- void AnnounceIfSubscribed(TrackNamespace track_namespace) {
+ void PublishNamespaceIfSubscribed(TrackNamespace track_namespace) {
for (const TrackNamespace& subscribed_namespace :
subscribed_namespaces_) {
if (track_namespace.InNamespace(subscribed_namespace)) {
- session_->Announce(
+ session_->PublishNamespace(
track_namespace,
absl::bind_front(&ChatServer::ChatServerSessionHandler::
- OnOutgoingAnnounceReply,
+ OnOutgoingPublishNamespaceReply,
this),
VersionSpecificParameters());
return;
@@ -79,24 +79,24 @@
}
}
- void UnannounceIfSubscribed(TrackNamespace track_namespace) {
+ void PublishNamespaceDoneIfSubscribed(TrackNamespace track_namespace) {
for (const TrackNamespace& subscribed_namespace :
subscribed_namespaces_) {
if (track_namespace.InNamespace(subscribed_namespace)) {
- session_->Unannounce(track_namespace);
+ session_->PublishNamespaceDone(track_namespace);
return;
}
}
}
private:
- // Callback for incoming announces.
- std::optional<MoqtAnnounceErrorReason> OnIncomingAnnounce(
+ // Callback for incoming publish_namespaces.
+ std::optional<MoqtPublishNamespaceErrorReason> OnIncomingPublishNamespace(
const moqt::TrackNamespace& track_namespace,
std::optional<VersionSpecificParameters> parameters);
- void OnOutgoingAnnounceReply(
+ void OnOutgoingPublishNamespaceReply(
TrackNamespace track_namespace,
- std::optional<MoqtAnnounceErrorReason> error_message);
+ std::optional<MoqtPublishNamespaceErrorReason> error_message);
MoqtSession* session_; // Not owned.
// This design assumes that each server has exactly one username, although
diff --git a/quiche/quic/moqt/tools/moq_chat.h b/quiche/quic/moqt/tools/moq_chat.h
index 9d43814..ea40a84 100644
--- a/quiche/quic/moqt/tools/moq_chat.h
+++ b/quiche/quic/moqt/tools/moq_chat.h
@@ -44,7 +44,7 @@
std::optional<FullTrackName> ConstructTrackNameFromNamespace(
const TrackNamespace& track_namespace, absl::string_view chat_id);
-// Strips "chat" from the end of |track_name| to use in ANNOUNCE.
+// Strips "chat" from the end of |track_name| to use in PUBLISH_NAMESPACE.
const TrackNamespace& GetUserNamespace(const FullTrackName& track_name);
// Returns {"moq-chat", chat-id}, useful for SUBSCRIBE_NAMESPACE.
diff --git a/quiche/quic/moqt/tools/moq_chat_end_to_end_test.cc b/quiche/quic/moqt/tools/moq_chat_end_to_end_test.cc
index f808d47..0527dfe 100644
--- a/quiche/quic/moqt/tools/moq_chat_end_to_end_test.cc
+++ b/quiche/quic/moqt/tools/moq_chat_end_to_end_test.cc
@@ -96,8 +96,8 @@
TEST_F(MoqChatEndToEndTest, EndToEndTest) {
EXPECT_TRUE(client1_->Connect(moqt::moq_chat::kWebtransPath));
EXPECT_TRUE(client2_->Connect(moqt::moq_chat::kWebtransPath));
- EXPECT_TRUE(client1_->AnnounceAndSubscribeNamespace());
- EXPECT_TRUE(client2_->AnnounceAndSubscribeNamespace());
+ EXPECT_TRUE(client1_->PublishNamespaceAndSubscribeNamespace());
+ EXPECT_TRUE(client2_->PublishNamespaceAndSubscribeNamespace());
SendAndWaitForOutput(interface1_, interface2_, "client1", "Hello");
SendAndWaitForOutput(interface2_, interface1_, "client2", "Hi");
SendAndWaitForOutput(interface1_, interface2_, "client1", "How are you?");
@@ -113,8 +113,8 @@
TEST_F(MoqChatEndToEndTest, LeaveAndRejoin) {
EXPECT_TRUE(client1_->Connect(moqt::moq_chat::kWebtransPath));
EXPECT_TRUE(client2_->Connect(moqt::moq_chat::kWebtransPath));
- EXPECT_TRUE(client1_->AnnounceAndSubscribeNamespace());
- EXPECT_TRUE(client2_->AnnounceAndSubscribeNamespace());
+ EXPECT_TRUE(client1_->PublishNamespaceAndSubscribeNamespace());
+ EXPECT_TRUE(client2_->PublishNamespaceAndSubscribeNamespace());
SendAndWaitForOutput(interface1_, interface2_, "client1", "Hello");
SendAndWaitForOutput(interface2_, interface1_, "client2", "Hi");
@@ -136,7 +136,7 @@
std::move(if1bptr), "test_chat", "client1", "device1",
server_.moqt_server().quic_server().event_loop());
EXPECT_TRUE(client1_->Connect(moqt::moq_chat::kWebtransPath));
- EXPECT_TRUE(client1_->AnnounceAndSubscribeNamespace());
+ EXPECT_TRUE(client1_->PublishNamespaceAndSubscribeNamespace());
SendAndWaitForOutput(interface1b_, interface2_, "client1", "Hello again");
SendAndWaitForOutput(interface2_, interface1b_, "client2", "Hi again");
}
diff --git a/quiche/quic/moqt/tools/moqt_ingestion_server_bin.cc b/quiche/quic/moqt/tools/moqt_ingestion_server_bin.cc
index 8fd51fe..c59955f 100644
--- a/quiche/quic/moqt/tools/moqt_ingestion_server_bin.cc
+++ b/quiche/quic/moqt/tools/moqt_ingestion_server_bin.cc
@@ -3,7 +3,7 @@
// found in the LICENSE file.
// moqt_ingestion_server is a simple command-line utility that accepts incoming
-// ANNOUNCE messages and records them into a file.
+// PUBLISH_NAMESPACE messages and records them into a file.
#include <sys/stat.h>
@@ -112,21 +112,24 @@
explicit MoqtIngestionHandler(MoqtSession* session,
absl::string_view output_root)
: session_(session), output_root_(output_root) {
- session_->callbacks().incoming_announce_callback =
- absl::bind_front(&MoqtIngestionHandler::OnAnnounceReceived, this);
+ session_->callbacks().incoming_publish_namespace_callback =
+ absl::bind_front(&MoqtIngestionHandler::OnPublishNamespaceReceived,
+ this);
}
- // TODO(martinduke): Handle when |announce| is false (UNANNOUNCE).
- std::optional<MoqtAnnounceErrorReason> OnAnnounceReceived(
+ // TODO(martinduke): Handle when |publish_namespace| is false
+ // (PUBLISH_NAMESPACE_DONE).
+ std::optional<MoqtPublishNamespaceErrorReason> OnPublishNamespaceReceived(
TrackNamespace track_namespace,
std::optional<VersionSpecificParameters> /*parameters*/) {
if (!IsValidTrackNamespace(track_namespace) &&
!quiche::GetQuicheCommandLineFlag(
FLAGS_allow_invalid_track_namespaces)) {
- QUICHE_DLOG(WARNING) << "Rejected remote announce as it contained "
- "disallowed characters; namespace: "
- << track_namespace;
- return MoqtAnnounceErrorReason{
+ QUICHE_DLOG(WARNING)
+ << "Rejected remote publish_namespace as it contained "
+ "disallowed characters; namespace: "
+ << track_namespace;
+ return MoqtPublishNamespaceErrorReason{
RequestErrorCode::kInternalError,
"Track namespace contains disallowed characters"};
}
@@ -146,8 +149,9 @@
subscribed_namespaces_.erase(it);
QUICHE_LOG(ERROR) << "Failed to create directory " << directory_path
<< "; " << status;
- return MoqtAnnounceErrorReason{RequestErrorCode::kInternalError,
- "Failed to create output directory"};
+ return MoqtPublishNamespaceErrorReason{
+ RequestErrorCode::kInternalError,
+ "Failed to create output directory"};
}
std::string track_list = quiche::GetQuicheCommandLineFlag(FLAGS_tracks);
diff --git a/quiche/quic/moqt/tools/moqt_mock_visitor.h b/quiche/quic/moqt/tools/moqt_mock_visitor.h
index 1dbc446..ac1571d 100644
--- a/quiche/quic/moqt/tools/moqt_mock_visitor.h
+++ b/quiche/quic/moqt/tools/moqt_mock_visitor.h
@@ -12,13 +12,14 @@
#include <variant>
#include "absl/status/status.h"
-#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
#include "quiche/quic/core/quic_time.h"
#include "quiche/quic/moqt/moqt_messages.h"
+#include "quiche/quic/moqt/moqt_object.h"
#include "quiche/quic/moqt/moqt_priority.h"
#include "quiche/quic/moqt/moqt_publisher.h"
#include "quiche/quic/moqt/moqt_session.h"
+#include "quiche/quic/moqt/moqt_session_callbacks.h"
#include "quiche/quic/moqt/moqt_track.h"
#include "quiche/common/platform/api/quiche_test.h"
@@ -29,17 +30,17 @@
testing::MockFunction<void(absl::string_view)> goaway_received_callback;
testing::MockFunction<void(absl::string_view)> session_terminated_callback;
testing::MockFunction<void()> session_deleted_callback;
- testing::MockFunction<std::optional<MoqtAnnounceErrorReason>(
+ testing::MockFunction<std::optional<MoqtPublishNamespaceErrorReason>(
const TrackNamespace&, std::optional<VersionSpecificParameters>)>
- incoming_announce_callback;
+ incoming_publish_namespace_callback;
testing::MockFunction<std::optional<MoqtSubscribeErrorReason>(
TrackNamespace, std::optional<VersionSpecificParameters>)>
- incoming_subscribe_announces_callback;
+ incoming_subscribe_namespace_callback;
MockSessionCallbacks() {
- ON_CALL(incoming_announce_callback, Call(testing::_, testing::_))
- .WillByDefault(DefaultIncomingAnnounceCallback);
- ON_CALL(incoming_subscribe_announces_callback, Call(testing::_, testing::_))
+ ON_CALL(incoming_publish_namespace_callback, Call(testing::_, testing::_))
+ .WillByDefault(DefaultIncomingPublishNamespaceCallback);
+ ON_CALL(incoming_subscribe_namespace_callback, Call(testing::_, testing::_))
.WillByDefault(DefaultIncomingSubscribeNamespaceCallback);
}
@@ -49,8 +50,8 @@
goaway_received_callback.AsStdFunction(),
session_terminated_callback.AsStdFunction(),
session_deleted_callback.AsStdFunction(),
- incoming_announce_callback.AsStdFunction(),
- incoming_subscribe_announces_callback.AsStdFunction()};
+ incoming_publish_namespace_callback.AsStdFunction(),
+ incoming_subscribe_namespace_callback.AsStdFunction()};
}
};