Harden LA publishers and add multi-relay guide
Some checks are pending
ci-gates / checks (push) Waiting to run
deploy-cloudflare / checks (push) Waiting to run
deploy-cloudflare / deploy (push) Blocked by required conditions

This commit is contained in:
Conrad Kramer 2026-06-10 01:28:15 -07:00
parent 5d6f77f868
commit cfc4902016
No known key found for this signature in database
13 changed files with 1430 additions and 402 deletions

View file

@ -5116,20 +5116,33 @@ async fn control_resolve(args: ControlResolveArgs) -> Result<()> {
))
}
fn select_relay_transport_for_web(
transports: &[StreamTransportDescriptor],
) -> Option<(String, String, String)> {
for transport in transports {
if let StreamTransportDescriptor::RelayMoq {
url,
broadcast_name,
track_name,
} = transport
{
return Some((url.clone(), broadcast_name.clone(), track_name.clone()));
}
}
None
fn relay_transports_for_web(transports: &[StreamTransportDescriptor]) -> Vec<WebStreamRelay> {
transports
.iter()
.filter_map(|transport| {
if let StreamTransportDescriptor::RelayMoq {
url,
broadcast_name,
track_name,
} = transport
{
Some(WebStreamRelay {
relay_url: url.clone(),
broadcast_name: broadcast_name.clone(),
track_name: track_name.clone(),
})
} else {
None
}
})
.collect()
}
#[derive(Debug, Clone, serde::Serialize)]
struct WebStreamRelay {
relay_url: String,
broadcast_name: String,
track_name: String,
}
#[derive(Debug, serde::Serialize)]
@ -5139,6 +5152,7 @@ struct WebStreamUpsertReq<'a> {
relay_url: &'a str,
broadcast_name: &'a str,
track_name: &'a str,
relays: &'a [WebStreamRelay],
expires_ms: u64,
}
@ -5207,11 +5221,11 @@ async fn control_bridge_web(args: ControlBridgeWebArgs) -> Result<()> {
}
}
let Some((relay_url, broadcast_name, track_name)) =
select_relay_transport_for_web(&announcement.transports)
else {
let relays = relay_transports_for_web(&announcement.transports);
if relays.is_empty() {
continue;
};
}
let primary_relay = &relays[0];
if last_upserted_unix_ms
.get(&stream_id)
@ -5224,9 +5238,10 @@ async fn control_bridge_web(args: ControlBridgeWebArgs) -> Result<()> {
let payload = WebStreamUpsertReq {
stream_id: &stream_id,
title: &announcement.stream.title,
relay_url: &relay_url,
broadcast_name: &broadcast_name,
track_name: &track_name,
relay_url: &primary_relay.relay_url,
broadcast_name: &primary_relay.broadcast_name,
track_name: &primary_relay.track_name,
relays: &relays,
expires_ms: now_unix_ms().saturating_add(ttl_ms),
};
@ -5253,8 +5268,9 @@ async fn control_bridge_web(args: ControlBridgeWebArgs) -> Result<()> {
last_upserted_unix_ms.insert(stream_id.clone(), announcement.updated_unix_ms);
tracing::info!(
stream = %stream_id,
relay = %relay_url,
broadcast = %broadcast_name,
relay = %primary_relay.relay_url,
broadcast = %primary_relay.broadcast_name,
relay_count = relays.len(),
"web stream upserted"
);
if args.once {
@ -6853,6 +6869,7 @@ async fn wt_publish(args: WtPublishArgs) -> Result<()> {
cmd.stdout(Stdio::piped());
cmd.stderr(Stdio::inherit());
cmd.kill_on_drop(true);
tracing::info!(input=%args.input, "spawning ffmpeg");
let mut child = cmd.spawn().context("failed to spawn ffmpeg")?;
@ -6990,6 +7007,7 @@ async fn nbc_wt_publish(args: NbcWtPublishArgs) -> Result<()> {
cmd.stdin(Stdio::piped());
cmd.stdout(Stdio::piped());
cmd.stderr(Stdio::inherit());
cmd.kill_on_drop(true);
tracing::info!(
source_url = %args.source_url,