ceres: a small planet in a giant solar system
33
fork

Configure Feed

Select the types of activity you want to include in your feed.

wip

+34 -8
+8
Cargo.lock
··· 110 110 ] 111 111 112 112 [[package]] 113 + name = "anyhow" 114 + version = "1.0.102" 115 + source = "registry+https://github.com/rust-lang/crates.io-index" 116 + checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" 117 + 118 + [[package]] 113 119 name = "ascii" 114 120 version = "1.1.0" 115 121 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 382 388 name = "ceres" 383 389 version = "0.1.0" 384 390 dependencies = [ 391 + "anyhow", 385 392 "axum", 386 393 "dotenvy", 387 394 "env_logger", 388 395 "jacquard", 389 396 "jacquard-api", 390 397 "jacquard-axum", 398 + "jacquard-identity", 391 399 "log", 392 400 "reqwest", 393 401 "serde",
+2
Cargo.toml
··· 4 4 edition = "2024" 5 5 6 6 [dependencies] 7 + anyhow = "1.0.102" 7 8 axum = "0.8.9" 8 9 dotenvy = "0.15.7" 9 10 env_logger = "0.11.10" 10 11 jacquard = "0.11.0" 11 12 jacquard-api = { version = "0.11.1", features = ["default", "app_bsky"] } 12 13 jacquard-axum = "0.11.0" 14 + jacquard-identity = { version = "0.11.0", features = ["cache", "dns"] } 13 15 log = "0.4.29" 14 16 reqwest = { version = "0.12.23", features = ["stream", "json"] } 15 17 serde = { version = "1.0.228", features = ["derive"] }
+3 -1
src/handlers/xrpc/app_bsky_actor.rs
··· 68 68 69 69 pub fn routes(state: AppState) -> Router { 70 70 Router::<AppState>::new() 71 - .merge(GetProfileRequest::into_router::<_, AppState, _>(get_profile)) 71 + .merge(GetProfileRequest::into_router::<_, AppState, _>( 72 + get_profile, 73 + )) 72 74 .with_state(state) 73 75 }
+19 -7
src/main.rs
··· 1 - mod handlers; 2 - mod state; 3 - 4 1 use axum::{ 5 2 Json, Router, body, 6 3 extract::Request, ··· 18 15 use tokio::net::TcpListener; 19 16 use tower_http::cors::CorsLayer; 20 17 18 + mod handlers; 19 + mod state; 20 + 21 + static APP_USER_AGENT: &str = concat!(env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VERSION"),); 22 + 21 23 #[tokio::main] 22 - async fn main() { 24 + async fn main() -> anyhow::Result<()> { 23 25 dotenvy::dotenv().ok(); 24 26 env_logger::Builder::from_env(Env::default().default_filter_or("info")).init(); 25 27 26 28 let bind_addr = env::var("BIND_ADDR").unwrap_or_else(|_| "127.0.0.1:3000".to_string()); 27 - let resolver = JacquardResolver::new(reqwest::Client::new(), ResolverOptions::default()); 29 + 30 + let reqwest_client = reqwest::Client::builder() 31 + .user_agent(APP_USER_AGENT) 32 + .build()?; 33 + 34 + let resolver = JacquardResolver::new(reqwest_client.clone(), ResolverOptions::default()); 28 35 29 36 let app_view_domain = env::var("APP_VIEW_DOMAIN").expect("APP_VIEW_DOMAIN is not set"); 30 37 let service_did = Did::new_owned(format!("did:web:{app_view_domain}")) 31 38 .expect("APP_VIEW_DOMAIN produced an invalid did:web"); 32 - let service_auth = ServiceAuthConfig::new(service_did, resolver); 39 + let service_auth = ServiceAuthConfig::new(service_did, resolver.clone()); 33 40 34 - let state = AppState { service_auth }; 41 + let state = AppState { 42 + service_auth, 43 + reqwest_client, 44 + resolver, 45 + }; 35 46 36 47 let app = Router::new() 37 48 .route("/.well-known/did.json", get(did_document)) ··· 45 56 info!("listening on https://{bind_addr}"); 46 57 47 58 axum::serve(listener, app).await.expect("server error"); 59 + Ok(()) 48 60 } 49 61 50 62 async fn log_request(req: Request) -> (StatusCode, Json<Value>) {
+2
src/state.rs
··· 4 4 #[derive(Clone)] 5 5 pub struct AppState { 6 6 pub service_auth: ServiceAuthConfig<JacquardResolver>, 7 + pub reqwest_client: reqwest::Client, 8 + pub resolver: JacquardResolver, 7 9 } 8 10 9 11 impl ServiceAuth for AppState {