moq-karp 0.5.0

Media over QUIC
Documentation
use moq_transfork::{Path, Session};

use crate::{
	catalog::{self},
	Error,
};

use super::{Audio, Video};

pub struct Broadcast {
	catalog: catalog::Broadcast,
	catalog_track: Option<moq_transfork::TrackProducer>,
	session: Session,
	path: Path,
}

impl Broadcast {
	pub fn new(session: Session, path: Path) -> Self {
		Self {
			session,
			path,
			catalog: catalog::Broadcast::default(),
			catalog_track: None,
		}
	}

	pub fn create_video(&mut self, info: catalog::Video) -> Result<Video, Error> {
		let (producer, consumer) = moq_transfork::Track {
			path: self.path.clone().push(&info.track.name),
			priority: info.track.priority,
			..Default::default()
		}
		.produce();

		self.session.publish(consumer)?;
		let track = Video::new(producer);

		self.catalog.video.push(info);
		self.publish()?;

		Ok(track)
	}

	pub fn create_audio(&mut self, info: catalog::Audio) -> Result<Audio, Error> {
		let (producer, consumer) = moq_transfork::Track {
			path: self.path.clone().push(&info.track.name),
			priority: info.track.priority,
			..Default::default()
		}
		.produce();

		self.session.publish(consumer)?;
		let track = Audio::new(producer);

		self.catalog.audio.push(info);
		self.publish()?;

		Ok(track)
	}

	pub fn catalog(&self) -> &catalog::Broadcast {
		&self.catalog
	}

	fn publish(&mut self) -> Result<(), Error> {
		if let Some(track) = self.catalog_track.as_mut() {
			return Ok(self.catalog.update(track)?);
		}

		let path = self.path.clone().push("catalog.json");
		self.catalog_track = self.catalog.publish(&mut self.session, path)?.into();

		Ok(())
	}

	pub async fn closed(&self) {
		self.session.closed().await;
	}
}