char/serve-esm
git clone https://git.t4t.associates/char/serve-esm
e06f6b7
main
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 <()> { 12let root = std:: env:: var_os ( "TARGET_DIR" ). context ( "TARGET_DIR is required" ) ?; 13let handler =create_handler ( root). context ( "opening TARGET_DIR" ) ?; 14if let Some ( path) = std:: env:: var_os ( "SOCKET_PATH" ) { 15let listener =UnixListener :: bind ( & path) ?; 16eprintln! ( "listening on {}" , std:: path:: Path :: new ( & path). display ()); 17loop { 18serve ( listener. accept (). await ?. 0 , handler. clone ()); 19} 20} else { 21let address = std:: env:: var ( "LISTEN" ). unwrap_or_else ( |_|"0.0.0.0:8000" . into ()); 22let listener =TcpListener :: bind ( address). await ?; 23eprintln! ( "listening on http://{}" , listener. local_addr () ?); 24loop { 25serve ( listener. accept (). await ?. 0 , handler. clone ()); 26} 27} 28} 29 30fn serve < I >( io : I , handler : Handler < Incoming >) 31where 32I : AsyncRead +AsyncWrite +Unpin +Send +' static , 33{ 34 tokio:: spawn ( async move { 35let connection = http1:: Builder :: new () 36. serve_connection ( TokioIo :: new ( io), TowerToHyperService :: new ( handler)); 37if let Err ( error) = connection. await { 38eprintln! ( "HTTP connection failed: {error}" ); 39} 40}); 41}