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}