add: h265 & AV1 support (with a lot of fixes)
This commit is contained in:
+35
-28
@@ -1,4 +1,10 @@
|
||||
use std::{net::SocketAddr, sync::Arc};
|
||||
use std::{
|
||||
net::SocketAddr,
|
||||
sync::{
|
||||
Arc,
|
||||
atomic::{AtomicI32, Ordering},
|
||||
},
|
||||
};
|
||||
|
||||
use axum::{
|
||||
Json, Router,
|
||||
@@ -41,13 +47,13 @@ pub struct HttpServer {
|
||||
pub offer_tx: Sender<(i32, i32, String)>,
|
||||
pub accept_rx: async_broadcast::InactiveReceiver<(i32, Option<String>)>,
|
||||
pub appstate: Arc<Mutex<AppState>>,
|
||||
pub request_count: Mutex<i32>,
|
||||
pub request_count: AtomicI32,
|
||||
pub db: DatabaseConnection,
|
||||
pub config: HttpServerConfig,
|
||||
pub config: Arc<HttpServerConfig>,
|
||||
}
|
||||
|
||||
impl HttpServer {
|
||||
pub fn start(self) -> Result<(), Box<dyn std::error::Error>> {
|
||||
pub async fn run(self) {
|
||||
let state = Arc::new(self);
|
||||
|
||||
let origins = [
|
||||
@@ -66,27 +72,29 @@ impl HttpServer {
|
||||
.allow_credentials(true)
|
||||
.allow_origin(origins);
|
||||
|
||||
tokio::spawn(async move {
|
||||
let app = Router::new()
|
||||
.route("/api/catalog", get(catalog_handler))
|
||||
.route("/api/user", post(create_user_handler))
|
||||
.route(
|
||||
"/api/stream-key",
|
||||
post(create_stream_key_handler).get(get_all_stream_keys),
|
||||
)
|
||||
// .route("/api/admin/server_stats", get(todo!()))
|
||||
.route("/api/whip", post(handle_whip_injest))
|
||||
.route("/api/login", post(login_handler))
|
||||
.route("/api/stream/{slug}", post(stream_handler))
|
||||
.route("/api/meow", get(meow_handler))
|
||||
.layer(cors)
|
||||
.with_state(state);
|
||||
// TODO: Add an error type that impls IntoResponse, enum HttpError {}; impl IntoResponse for
|
||||
// HttpError
|
||||
// https://docs.rs/thiserror/latest/thiserror/
|
||||
//
|
||||
// Its rather shitty
|
||||
let app = Router::new()
|
||||
.route("/api/catalog", get(catalog_handler))
|
||||
.route("/api/user", post(create_user_handler))
|
||||
.route(
|
||||
"/api/stream-key",
|
||||
post(create_stream_key_handler).get(get_all_stream_keys),
|
||||
)
|
||||
// .route("/api/admin/server_stats", get(todo!()))
|
||||
.route("/api/whip", post(handle_whip_injest))
|
||||
.route("/api/login", post(login_handler))
|
||||
.route("/api/stream/{slug}", post(stream_handler))
|
||||
.route("/api/meow", get(meow_handler))
|
||||
.layer(cors)
|
||||
.with_state(state);
|
||||
|
||||
let addr = SocketAddr::from(([0, 0, 0, 0], 3000));
|
||||
let listener = TcpListener::bind(addr).await.unwrap();
|
||||
axum::serve(listener, app).await.unwrap();
|
||||
});
|
||||
Ok(())
|
||||
let addr = SocketAddr::from(([0, 0, 0, 0], 3000));
|
||||
let listener = TcpListener::bind(addr).await.unwrap();
|
||||
axum::serve(listener, app).await.unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -263,6 +271,7 @@ async fn login_handler(
|
||||
let auth = auth_session::Entity::create(&state.db, x.id).await.unwrap();
|
||||
let token = auth.value;
|
||||
let mut meow = Response::new("".to_string());
|
||||
// TODO: Replace with axum cookie jar https://docs.rs/axum-extra/latest/axum_extra/extract/cookie/struct.CookieJar.html
|
||||
meow.headers_mut().insert(
|
||||
SET_COOKIE,
|
||||
format!("session={token}; SameSite=Strict; Path=/; Max-Age=2592000")
|
||||
@@ -324,6 +333,7 @@ async fn create_user_handler(
|
||||
};
|
||||
let token = session.value;
|
||||
let mut headers = HeaderMap::new();
|
||||
// TODO: Replace with axum cookie jar https://docs.rs/axum-extra/latest/axum_extra/extract/cookie/struct.CookieJar.html
|
||||
headers.insert(
|
||||
SET_COOKIE,
|
||||
format!("session={token}; HttpOnly; SameSite=Strict; Path=/")
|
||||
@@ -338,10 +348,7 @@ async fn stream_handler(
|
||||
Path(slug): Path<String>,
|
||||
body: String,
|
||||
) -> impl IntoResponse {
|
||||
let mut request_id = state.request_count.lock().await;
|
||||
*request_id += 1;
|
||||
let request_id_clone = *request_id;
|
||||
drop(request_id);
|
||||
let request_id_clone = state.request_count.fetch_add(1, Ordering::Relaxed);
|
||||
|
||||
let stream_key_id = {
|
||||
let app = state.appstate.lock().await;
|
||||
|
||||
Reference in New Issue
Block a user