feat: it should be streaming now

This commit is contained in:
Noa Aarts 2024-07-13 20:15:51 +02:00
parent f1656ba330
commit 8085298612
3 changed files with 43 additions and 10 deletions

21
Cargo.lock generated
View file

@ -122,6 +122,7 @@ checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"axum-core", "axum-core",
"axum-macros",
"bytes 1.6.0", "bytes 1.6.0",
"futures-util", "futures-util",
"http", "http",
@ -169,6 +170,18 @@ dependencies = [
"tracing", "tracing",
] ]
[[package]]
name = "axum-macros"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "00c055ee2d014ae5981ce1016374e8213682aa14d9bf40e48ab48b5f3ef20eaa"
dependencies = [
"heck 0.4.1",
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "backtrace" name = "backtrace"
version = "0.3.73" version = "0.3.73"
@ -552,6 +565,12 @@ version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
[[package]]
name = "heck"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
[[package]] [[package]]
name = "heck" name = "heck"
version = "0.5.0" version = "0.5.0"
@ -1379,7 +1398,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349"
dependencies = [ dependencies = [
"cfg-expr", "cfg-expr",
"heck", "heck 0.5.0",
"pkg-config", "pkg-config",
"toml", "toml",
"version-compare", "version-compare",

View file

@ -4,7 +4,7 @@ version = "0.1.0"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
axum = { version = "0.7.5" } axum = { version = "0.7.5", features = ["macros"] }
bytes = "1.6.0" bytes = "1.6.0"
futures = "0.3.30" futures = "0.3.30"
futures-util = "0.3.30" futures-util = "0.3.30"

View file

@ -12,8 +12,15 @@ use std::{
time::Duration, time::Duration,
}; };
use futures::Stream; use axum::{
use hyper::body::Frame; body::Body,
extract::State,
http::header,
response::{IntoResponse, Response},
routing::get,
};
use futures::{Stream, StreamExt};
use http_body_util::StreamBody;
use image::{GenericImageView, Rgb}; use image::{GenericImageView, Rgb};
use tokio::{ use tokio::{
io::{AsyncReadExt, AsyncWriteExt, BufReader, BufWriter}, io::{AsyncReadExt, AsyncWriteExt, BufReader, BufWriter},
@ -154,7 +161,7 @@ impl ImageStreamer {
} }
impl Stream for ImageStreamer { impl Stream for ImageStreamer {
type Item = io::Result<hyper::body::Frame<bytes::Bytes>>; type Item = io::Result<Vec<u8>>;
fn poll_next( fn poll_next(
mut self: std::pin::Pin<&mut Self>, mut self: std::pin::Pin<&mut Self>,
@ -173,7 +180,7 @@ impl Stream for ImageStreamer {
let r = self.v.read().unwrap(); let r = self.v.read().unwrap();
let v: Vec<u8> = (*r.clone().into_inner()).to_vec(); let v: Vec<u8> = (*r.clone().into_inner()).to_vec();
return Poll::Ready(Some(Ok(Frame::data(v.into())))); return Poll::Ready(Some(Ok(v)));
} }
} }
} }
@ -371,14 +378,15 @@ where
} }
} }
async fn image_handler(State(state): State<ImageStreamer>) { #[axum::debug_handler]
async fn image_handler(State(state): State<ImageStreamer>) -> impl IntoResponse {
let cstrem = state.clone(); let cstrem = state.clone();
let header = [(header::CONTENT_TYPE, "image/jpeg")]; let header = [(header::CONTENT_TYPE, "image/jpeg")];
let body = StreamBody::new(cstrem); let body = Body::from_stream(cstrem);
(header, body); (header, body).into_response()
} }
#[tokio::main] #[tokio::main]
@ -405,7 +413,13 @@ async fn main() -> io::Result<()> {
let web_listener = TcpListener::bind("0.0.0.0:7792").await?; let web_listener = TcpListener::bind("0.0.0.0:7792").await?;
println!("bound web listener"); println!("bound web listener");
let _ = tokio::spawn(async move { web(web_listener, streamer) }); let router = axum::Router::new()
.route("/image", get(image_handler))
.with_state(streamer);
let _ = tokio::spawn(async move {
return axum::serve(web_listener, router).await;
});
println!("web server started"); println!("web server started");
loop { loop {