use anyhow::Context;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
moq_native::Log::new(tracing::Level::DEBUG).init()?;
let origin = moq_net::Origin::random().produce();
tokio::select! {
res = run_session(origin.clone()) => res,
res = run_broadcast(origin) => res,
}
}
async fn run_session(origin: moq_net::origin::Producer) -> anyhow::Result<()> {
let client = moq_native::ClientConfig::default().init()?;
let url = url::Url::parse("https://cdn.moq.dev/anon/chat-example").unwrap();
let cs = client.with_publisher(&origin).connect(url).await?;
Err(cs.closed().await.into())
}
async fn run_broadcast(origin: moq_net::origin::Producer) -> anyhow::Result<()> {
let mut broadcast = origin
.create_broadcast("", moq_net::broadcast::Route::new().with_announce(true))
.context("failed to create broadcast")?;
let mut track = broadcast.create_track("chat", None)?;
let mut group = track.append_group()?;
group.write_frame(
moq_native::moq_net::Timestamp::now(),
bytes::Bytes::from_static(b"Hello"),
)?;
group.write_frame(
moq_native::moq_net::Timestamp::now(),
bytes::Bytes::from_static(b"World"),
)?;
group.finish()?;
tracing::info!("wrote hello + world");
tokio::time::sleep(tokio::time::Duration::from_secs(10)).await;
track.write_frame(
moq_native::moq_net::Timestamp::now(),
bytes::Bytes::from_static(b"foobarbaz"),
)?;
tracing::info!("wrote foobarbaz");
tokio::time::sleep(tokio::time::Duration::from_secs(10)).await;
broadcast.finish();
Ok(())
}