char/serve-esm

git clone https://git.t4t.associates/char/serve-esm

Charlotte SomRewrite serve-esm in Rust using Tower and Hypere06f6b7

main
1.4 KiB41 linesraw
1use anyhow::{Context, Result};
2use hyper::{body::Incoming, server::conn::http1};
3use hyper_util::{rt::TokioIo, service::TowerToHyperService};
4use serve_esm::{Handler, create_handler};
5use tokio::{
6    io::{AsyncRead, AsyncWrite},
7    net::{TcpListener, UnixListener},
8};
9
10#[tokio::main]
11async fn main() -> Result<()> {
12    let root = std::env::var_os("TARGET_DIR").context("TARGET_DIR is required")?;
13    let handler = create_handler(root).context("opening TARGET_DIR")?;
14    if let Some(path) = std::env::var_os("SOCKET_PATH") {
15        let listener = UnixListener::bind(&path)?;
16        eprintln!("listening on {}", std::path::Path::new(&path).display());
17        loop {
18            serve(listener.accept().await?.0, handler.clone());
19        }
20    } else {
21        let address = std::env::var("LISTEN").unwrap_or_else(|_| "0.0.0.0:8000".into());
22        let listener = TcpListener::bind(address).await?;
23        eprintln!("listening on http://{}", listener.local_addr()?);
24        loop {
25            serve(listener.accept().await?.0, handler.clone());
26        }
27    }
28}
29
30fn serve<I>(io: I, handler: Handler<Incoming>)
31where
32    I: AsyncRead + AsyncWrite + Unpin + Send + 'static,
33{
34    tokio::spawn(async move {
35        let connection = http1::Builder::new()
36            .serve_connection(TokioIo::new(io), TowerToHyperService::new(handler));
37        if let Err(error) = connection.await {
38            eprintln!("HTTP connection failed: {error}");
39        }
40    });
41}