use crate::error::IngestError;
use lvqr_moq::OriginProducer;
use std::future::Future;
use std::pin::Pin;
use tokio_util::sync::CancellationToken;
pub trait IngestProtocol: Send + Sync {
fn name(&self) -> &str;
fn run<'a>(
&'a self,
origin: &'a OriginProducer,
cancel: CancellationToken,
) -> Pin<Box<dyn Future<Output = Result<(), IngestError>> + Send + 'a>>;
}
#[cfg(feature = "rtmp")]
mod rtmp_impl {
use super::*;
use crate::bridge::RtmpMoqBridge;
use crate::rtmp::RtmpConfig;
use lvqr_auth::{NoopAuthProvider, SharedAuth};
use std::sync::Arc;
pub struct RtmpIngest {
config: RtmpConfig,
auth: SharedAuth,
}
impl RtmpIngest {
pub fn new(config: RtmpConfig) -> Self {
Self {
config,
auth: Arc::new(NoopAuthProvider),
}
}
pub fn with_auth(config: RtmpConfig, auth: SharedAuth) -> Self {
Self { config, auth }
}
}
impl IngestProtocol for RtmpIngest {
fn name(&self) -> &str {
"RTMP"
}
fn run<'a>(
&'a self,
origin: &'a OriginProducer,
cancel: CancellationToken,
) -> Pin<Box<dyn Future<Output = Result<(), IngestError>> + Send + 'a>> {
let bridge = RtmpMoqBridge::with_auth(origin.clone(), self.auth.clone());
let server = bridge.create_rtmp_server(self.config.clone());
Box::pin(async move { server.run(cancel).await })
}
}
}
#[cfg(feature = "rtmp")]
pub use rtmp_impl::RtmpIngest;