Skip to main content

tuwunel_service/resolver/
mod.rs

1pub mod actual;
2pub mod cache;
3mod dns;
4pub mod fed;
5#[cfg(test)]
6mod tests;
7mod well_known;
8
9use std::sync::Arc;
10
11use async_trait::async_trait;
12use ruma::OwnedServerName;
13use tuwunel_core::{Result, smallstr::SmallString, utils::MutexMap};
14
15pub use self::dns::Validating;
16use self::{cache::Cache, dns::Resolver, fed::FedDest};
17
18pub struct Service {
19	pub cache: Arc<Cache>,
20	pub resolver: Arc<Resolver>,
21	resolving: Resolving,
22	services: Arc<crate::services::OnceServices>,
23}
24
25pub(crate) type DestString = SmallString<[u8; 40]>;
26type Resolving = MutexMap<OwnedServerName, ()>;
27
28#[async_trait]
29impl crate::Service for Service {
30	fn build(args: &crate::Args<'_>) -> Result<Arc<Self>> {
31		let cache = Cache::new(args);
32		Ok(Arc::new(Self {
33			cache: cache.clone(),
34			resolver: Resolver::build(args.server, cache)?,
35			resolving: MutexMap::new(),
36			services: args.services.clone(),
37		}))
38	}
39
40	async fn clear_cache(&self) {
41		self.resolver.clear_cache();
42		self.cache.clear().await;
43	}
44
45	fn name(&self) -> &str { crate::service::make_name(std::module_path!()) }
46}