Constellation, Spacedust, Slingshot, UFOs: atproto crates and services for microcosm

cors and tracing

Changed files
+27 -16
slingshot
+1 -1
Cargo.lock
··· 4921 4921 "atrium-oauth", 4922 4922 "clap", 4923 4923 "ctrlc", 4924 - "env_logger", 4925 4924 "foyer", 4926 4925 "hickory-resolver", 4927 4926 "jetstream", ··· 4938 4937 "time", 4939 4938 "tokio", 4940 4939 "tokio-util", 4940 + "tracing-subscriber", 4941 4941 "url", 4942 4942 ] 4943 4943
+1 -1
slingshot/Cargo.toml
··· 10 10 atrium-oauth = "0.1.3" 11 11 clap = { version = "4.5.41", features = ["derive"] } 12 12 ctrlc = "3.4.7" 13 - env_logger = "0.11.8" 14 13 foyer = { version = "0.18.0", features = ["serde"] } 15 14 hickory-resolver = "0.25.2" 16 15 jetstream = { path = "../jetstream", features = ["metrics"] } ··· 27 26 time = { version = "0.3.41", features = ["serde"] } 28 27 tokio = { version = "1.47.0", features = ["full"] } 29 28 tokio-util = "0.7.15" 29 + tracing-subscriber = { version = "0.3.19", features = ["env-filter"] } 30 30 url = "2.5.4"
+1 -1
slingshot/src/main.rs
··· 35 35 36 36 #[tokio::main] 37 37 async fn main() -> Result<(), String> { 38 - env_logger::init(); 38 + tracing_subscriber::fmt::init(); 39 39 40 40 let shutdown = CancellationToken::new(); 41 41
+24 -13
slingshot/src/server.rs
··· 5 5 use tokio_util::sync::CancellationToken; 6 6 7 7 use poem::{ 8 - Endpoint, Route, Server, 8 + Endpoint, EndpointExt, Route, Server, 9 9 endpoint::make_sync, 10 + http::Method, 10 11 listener::{ 11 12 Listener, TcpListener, 12 13 acme::{AutoCert, LETS_ENCRYPT_PRODUCTION}, 13 14 }, 15 + middleware::{Cors, Tracing}, 14 16 }; 15 17 use poem_openapi::{ 16 18 ApiResponse, Object, OpenApi, OpenApiService, param::Query, payload::Json, types::Example, ··· 242 244 .server("http://localhost:3000") 243 245 .url_prefix("/xrpc"); 244 246 245 - let app = Route::new() 247 + let mut app = Route::new() 246 248 .nest("/", api_service.scalar()) 247 249 .nest("/openapi.json", api_service.spec_endpoint()) 248 250 .nest("/xrpc/", api_service); ··· 252 254 .install_default() 253 255 .expect("alskfjalksdjf"); 254 256 255 - let app = app.at("/.well-known/did.json", get_did_doc(&host)); 257 + app = app 258 + .at("/.well-known/did.json", get_did_doc(&host)); 256 259 257 260 let auto_cert = AutoCert::builder() 258 261 .directory_url(LETS_ENCRYPT_PRODUCTION) ··· 260 263 .build() 261 264 .map_err(ServerError::AcmeBuildError)?; 262 265 263 - Server::new(TcpListener::bind("0.0.0.0:443").acme(auto_cert)) 264 - .name("slingshot") 265 - .run(app) 266 - .await 267 - .map_err(ServerError::ServerExited) 266 + run(TcpListener::bind("0.0.0.0:443").acme(auto_cert), app).await 268 267 } else { 269 - Server::new(TcpListener::bind("127.0.0.1:3000")) 270 - .name("slingshot") 271 - .run(app) 272 - .await 273 - .map_err(ServerError::ServerExited) 268 + run(TcpListener::bind("127.0.0.1:3000"), app).await 274 269 } 275 270 } 271 + 272 + async fn run<L>(listener: L, app: Route) -> Result<(), ServerError> 273 + where 274 + L: Listener + 'static 275 + { 276 + let app = app 277 + .with(Cors::new() 278 + .allow_method(Method::GET) 279 + .allow_credentials(false)) 280 + .with(Tracing); 281 + Server::new(listener) 282 + .name("slingshot") 283 + .run(app) 284 + .await 285 + .map_err(ServerError::ServerExited) 286 + }