use std::sync::Arc; use crate::client::DefaultHttpClient; use atrium_identity::{ did::{CommonDidResolver, CommonDidResolverConfig, DEFAULT_PLC_DIRECTORY_URL}, handle::{AtprotoHandleResolver, AtprotoHandleResolverConfig, DnsTxtResolver}, identity_resolver::{IdentityResolver, IdentityResolverConfig}, }; use hickory_resolver::TokioResolver; pub struct HickoryDnsTxtResolver { resolver: TokioResolver, } impl Default for HickoryDnsTxtResolver { fn default() -> Self { let resolver = TokioResolver::builder_tokio() .expect("failed to create resolver") .build(); Self { resolver } } } impl DnsTxtResolver for HickoryDnsTxtResolver { async fn resolve( &self, query: &str, ) -> core::result::Result, Box> { Ok(self .resolver .txt_lookup(query) .await? .iter() .map(|txt| txt.to_string()) .collect()) } } pub fn id_resolver() -> IdentityResolver< CommonDidResolver, AtprotoHandleResolver, > { let http_client = Arc::new(DefaultHttpClient::default()); let handle_resolver = AtprotoHandleResolver::new(AtprotoHandleResolverConfig { dns_txt_resolver: HickoryDnsTxtResolver::default(), http_client: Arc::clone(&http_client), }); let did_resolver = CommonDidResolver::new(CommonDidResolverConfig { plc_directory_url: DEFAULT_PLC_DIRECTORY_URL.into(), http_client: Arc::clone(&http_client), }); IdentityResolver::new(IdentityResolverConfig { did_resolver, handle_resolver, }) }