mount an atproto PDS repository as a FUSE filesystem
1use std::sync::Arc; 2 3use crate::client::DefaultHttpClient; 4 5use atrium_identity::{ 6 did::{CommonDidResolver, CommonDidResolverConfig, DEFAULT_PLC_DIRECTORY_URL}, 7 handle::{AtprotoHandleResolver, AtprotoHandleResolverConfig, DnsTxtResolver}, 8 identity_resolver::{IdentityResolver, IdentityResolverConfig}, 9}; 10use hickory_resolver::TokioResolver; 11 12pub struct HickoryDnsTxtResolver { 13 resolver: TokioResolver, 14} 15 16impl Default for HickoryDnsTxtResolver { 17 fn default() -> Self { 18 let resolver = TokioResolver::builder_tokio() 19 .expect("failed to create resolver") 20 .build(); 21 Self { resolver } 22 } 23} 24 25impl DnsTxtResolver for HickoryDnsTxtResolver { 26 async fn resolve( 27 &self, 28 query: &str, 29 ) -> core::result::Result<Vec<String>, Box<dyn std::error::Error + Send + Sync + 'static>> { 30 Ok(self 31 .resolver 32 .txt_lookup(query) 33 .await? 34 .iter() 35 .map(|txt| txt.to_string()) 36 .collect()) 37 } 38} 39 40pub fn id_resolver() -> IdentityResolver< 41 CommonDidResolver<DefaultHttpClient>, 42 AtprotoHandleResolver<HickoryDnsTxtResolver, DefaultHttpClient>, 43> { 44 let http_client = Arc::new(DefaultHttpClient::default()); 45 let handle_resolver = AtprotoHandleResolver::new(AtprotoHandleResolverConfig { 46 dns_txt_resolver: HickoryDnsTxtResolver::default(), 47 http_client: Arc::clone(&http_client), 48 }); 49 let did_resolver = CommonDidResolver::new(CommonDidResolverConfig { 50 plc_directory_url: DEFAULT_PLC_DIRECTORY_URL.into(), 51 http_client: Arc::clone(&http_client), 52 }); 53 IdentityResolver::new(IdentityResolverConfig { 54 did_resolver, 55 handle_resolver, 56 }) 57}