feat: it should be streaming now
This commit is contained in:
parent
f1656ba330
commit
8085298612
3 changed files with 43 additions and 10 deletions
21
Cargo.lock
generated
21
Cargo.lock
generated
|
|
@ -122,6 +122,7 @@ checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf"
|
|||
dependencies = [
|
||||
"async-trait",
|
||||
"axum-core",
|
||||
"axum-macros",
|
||||
"bytes 1.6.0",
|
||||
"futures-util",
|
||||
"http",
|
||||
|
|
@ -169,6 +170,18 @@ dependencies = [
|
|||
"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]]
|
||||
name = "backtrace"
|
||||
version = "0.3.73"
|
||||
|
|
@ -552,6 +565,12 @@ version = "0.14.5"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
|
||||
|
||||
[[package]]
|
||||
name = "heck"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
|
||||
|
||||
[[package]]
|
||||
name = "heck"
|
||||
version = "0.5.0"
|
||||
|
|
@ -1379,7 +1398,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349"
|
||||
dependencies = [
|
||||
"cfg-expr",
|
||||
"heck",
|
||||
"heck 0.5.0",
|
||||
"pkg-config",
|
||||
"toml",
|
||||
"version-compare",
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ version = "0.1.0"
|
|||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
axum = { version = "0.7.5" }
|
||||
axum = { version = "0.7.5", features = ["macros"] }
|
||||
bytes = "1.6.0"
|
||||
futures = "0.3.30"
|
||||
futures-util = "0.3.30"
|
||||
|
|
|
|||
30
src/main.rs
30
src/main.rs
|
|
@ -12,8 +12,15 @@ use std::{
|
|||
time::Duration,
|
||||
};
|
||||
|
||||
use futures::Stream;
|
||||
use hyper::body::Frame;
|
||||
use axum::{
|
||||
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 tokio::{
|
||||
io::{AsyncReadExt, AsyncWriteExt, BufReader, BufWriter},
|
||||
|
|
@ -154,7 +161,7 @@ impl ImageStreamer {
|
|||
}
|
||||
|
||||
impl Stream for ImageStreamer {
|
||||
type Item = io::Result<hyper::body::Frame<bytes::Bytes>>;
|
||||
type Item = io::Result<Vec<u8>>;
|
||||
|
||||
fn poll_next(
|
||||
mut self: std::pin::Pin<&mut Self>,
|
||||
|
|
@ -173,7 +180,7 @@ impl Stream for ImageStreamer {
|
|||
let r = self.v.read().unwrap();
|
||||
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 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]
|
||||
|
|
@ -405,7 +413,13 @@ async fn main() -> io::Result<()> {
|
|||
let web_listener = TcpListener::bind("0.0.0.0:7792").await?;
|
||||
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");
|
||||
|
||||
loop {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue