diff --git a/crates/ec-node/src/main.rs b/crates/ec-node/src/main.rs index 2e8de92..8d5f842 100644 --- a/crates/ec-node/src/main.rs +++ b/crates/ec-node/src/main.rs @@ -457,8 +457,8 @@ struct WsSubscribeArgs { #[derive(Parser, Debug)] struct WtPublishArgs { /// Relay URL (WebTransport) to connect to. - /// Default points at moq.dev's public relay. - #[arg(long, default_value = "https://cdn.moq.dev/anon")] + /// Default points at every.channel's public relay. + #[arg(long, default_value = "https://relay.every.channel/anon")] url: String, /// Broadcast name to publish. /// @@ -483,7 +483,7 @@ struct WtPublishArgs { movflags: String, /// Transmit fMP4 fragments directly (passthrough mode). /// When false, the importer may reframe into CMAF fragments. - #[arg(long, default_value_t = false, action = clap::ArgAction::Set)] + #[arg(long, default_value_t = true, action = clap::ArgAction::Set)] passthrough: bool, /// Danger: disable TLS verification for the relay. #[arg(long, default_value_t = false)] @@ -531,7 +531,7 @@ struct NbcBootstrapArgs { #[derive(Parser, Debug)] struct NbcWtPublishArgs { /// Relay URL (WebTransport) to connect to. - #[arg(long, default_value = "https://cdn.moq.dev/anon")] + #[arg(long, default_value = "https://relay.every.channel/anon")] url: String, /// Broadcast name to publish. #[arg(long)] @@ -540,7 +540,7 @@ struct NbcWtPublishArgs { #[arg(long)] source_url: String, /// Transmit fMP4 fragments directly (passthrough mode). - #[arg(long, default_value_t = false, action = clap::ArgAction::Set)] + #[arg(long, default_value_t = true, action = clap::ArgAction::Set)] passthrough: bool, /// H.264 GOP/keyframe interval in frames. #[arg(long, default_value_t = WT_PUBLISH_GOP_FRAMES)] @@ -1795,6 +1795,41 @@ mod tests { assert!(set.contains("d")); } + #[test] + fn publish_commands_default_to_current_relay_passthrough() { + let cli = Cli::parse_from([ + "ec-node", + "wt-publish", + "--name", + "la-test", + "--input", + "http://example.invalid/auto/v2.1", + ]); + match cli.command { + Commands::WtPublish(args) => { + assert_eq!(args.url, "https://relay.every.channel/anon"); + assert!(args.passthrough); + } + _ => panic!("expected wt-publish command"), + } + + let cli = Cli::parse_from([ + "ec-node", + "nbc-wt-publish", + "--name", + "nbc-test", + "--source-url", + "https://example.invalid/live", + ]); + match cli.command { + Commands::NbcWtPublish(args) => { + assert_eq!(args.url, "https://relay.every.channel/anon"); + assert!(args.passthrough); + } + _ => panic!("expected nbc-wt-publish command"), + } + } + #[test] fn deterministic_enabled_reads_env() { let prev = std::env::var("EVERY_CHANNEL_DETERMINISTIC").ok(); diff --git a/evolution/proposals/ECP-0123-instant-station-guide-and-player-warmup.md b/evolution/proposals/ECP-0123-instant-station-guide-and-player-warmup.md index 672ec3b..44903c6 100644 --- a/evolution/proposals/ECP-0123-instant-station-guide-and-player-warmup.md +++ b/evolution/proposals/ECP-0123-instant-station-guide-and-player-warmup.md @@ -24,8 +24,10 @@ Also keep a short-lived local guide cache, merge cached entries with the HTML se `/api/public-streams` in the background with a bounded timeout. A slow or empty refresh no longer clears already visible channels. -Change the web client, publisher module defaults, runbook examples, and remote watch E2E default -relay to `https://relay.every.channel/anon`. Preload/preconnect the primary player dependencies and +Change the web client, publisher CLI/module defaults, runbook examples, and remote watch E2E default +relay to `https://relay.every.channel/anon`. Default `wt-publish` and `nbc-wt-publish` to fMP4 +passthrough so hotpatch-launched publishers emit the `timescale` and `trackId` CMAF catalog metadata +expected by the hosted `@moq/watch` element. Preload/preconnect the primary player dependencies and warm the `@moq/watch` custom element after first paint. Let `@moq/watch` use its available live transport fallback instead of forcing WebTransport-only playback. Add client performance marks for guide first render, guide fetch, watch request, player module readiness, player mount, catalog/live @@ -42,6 +44,8 @@ status, and first observable canvas frame when the browser exposes it. ## Rollout / teardown plan -Ship the static web change with the existing Worker asset deploy. Validate with clean-cache -desktop/mobile browser loads and check the app's `window.__ecPerf` marks. Teardown is removing the -HTML seed/cache/warmup path and returning to live-API-only station rendering. +Ship the static web change with the existing Worker asset deploy and roll the publisher hotpatch +binary to the LA nodes so their catalogs match the current watcher schema. Validate with clean-cache +desktop/mobile browser loads and check the app's `window.__ecPerf` marks plus a live tune through the +public relay. Teardown is removing the HTML seed/cache/warmup path, returning to live-API-only station +rendering, and explicitly passing `--passthrough=false` only if an older watcher path is restored.