use futures_util::{Stream, StreamExt};
use tokio_util::sync::CancellationToken;
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
pub use crate::web::{ApiChannelMessage, App, ImageContainer};
mod db;
mod users;
mod web;
pub use {
db::Camera, db::CameraPermission, db::CameraPermissionUserView, db::CameraPermissionView,
db::CameraSetting, db::CameraSettingNoMeta, db::Model, db::User, db::Video,
db::VideoCameraView,
};
pub fn or_until_shutdown<S>(
stream: S,
shutdown_token: CancellationToken,
) -> impl Stream<Item = S::Item>
where
S: Stream,
{
async_stream::stream! {
futures_util::pin_mut!(stream);
loop {
tokio::select! {
Some(item) = stream.next() => {
yield item
}
() = shutdown_token.cancelled() => {
break;
}
}
}
}
}
pub async fn run() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
tracing_subscriber::registry()
.with(
tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| {
format!(
"{}=debug,axum_login=debug,tower_sessions=debug,sqlx=warn,tower_http=debug",
env!("CARGO_CRATE_NAME")
)
.into()
}),
)
.with(tracing_subscriber::fmt::layer().compact().without_time())
.try_init()?;
App::new().await?.serve().await?;
Ok(())
}