@@ -3575,6 +3575,7 @@ TransportStatus MoqtSession::publish_live(std::istream& input,
35753575 } else {
35763576 // Await-subscribe mode: wait for subscriptions, then stream
35773577 bool fin = false ;
3578+ const auto await_subscribe_deadline = std::chrono::steady_clock::now () + subscriber_timeout_;
35783579
35793580 while (true ) {
35803581 bool is_eof;
@@ -3612,9 +3613,13 @@ TransportStatus MoqtSession::publish_live(std::istream& input,
36123613 // Read control messages
36133614 std::vector<std::uint8_t > chunk;
36143615 bool immediate_fin = false ;
3615- const auto read_timeout = (active_subscriptions.empty () && subscribed_tracks.empty ())
3616- ? subscriber_timeout_
3617- : std::chrono::milliseconds (0 );
3616+ const bool waiting_for_first_subscription =
3617+ active_subscriptions.empty () && subscribed_tracks.empty ();
3618+ const auto read_timeout =
3619+ waiting_for_first_subscription && !uses_request_streams (draft_version)
3620+ ? subscriber_timeout_
3621+ : (waiting_for_first_subscription ? std::chrono::milliseconds (25 )
3622+ : std::chrono::milliseconds (0 ));
36183623 const TransportStatus read_status =
36193624 transport_.read_stream (live_control_read_stream_id, chunk, immediate_fin, read_timeout);
36203625
@@ -3623,7 +3628,9 @@ TransportStatus MoqtSession::publish_live(std::istream& input,
36233628 fin = immediate_fin;
36243629 } else if (read_status.message == " timed out waiting for stream data" ||
36253630 read_status.message == " no queued read for stream" ) {
3626- if (active_subscriptions.empty () && subscribed_tracks.empty ()) {
3631+ if (waiting_for_first_subscription &&
3632+ (!uses_request_streams (draft_version) ||
3633+ std::chrono::steady_clock::now () >= await_subscribe_deadline)) {
36273634 std::cerr << " [moqt-session] live: no downstream SUBSCRIBE before timeout; "
36283635 " idle await-subscribe publish exiting"
36293636 << " namespace=" << track_namespace_
0 commit comments