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::Resolver;
16pub(crate) use self::dns::Validating;
17use self::{cache::Cache, fed::FedDest};
18
19pub struct Service {
20	pub cache: Arc<Cache>,
21	pub resolver: Arc<Resolver>,
22	resolving: Resolving,
23	services: Arc<crate::services::OnceServices>,
24}
25
26pub(crate) type DestString = SmallString<[u8; 40]>;
27type Resolving = MutexMap<OwnedServerName, ()>;
28
29#[async_trait]
30impl crate::Service for Service {
31	fn build(args: &crate::Args<'_>) -> Result<Arc<Self>> {
32		let cache = Cache::new(args);
33		Ok(Arc::new(Self {
34			cache: cache.clone(),
35			resolver: Resolver::build(args.server, cache)?,
36			resolving: MutexMap::new(),
37			services: args.services.clone(),
38		}))
39	}
40
41	async fn clear_cache(&self) {
42		self.resolver.clear_cache();
43		self.cache.clear().await;
44	}
45
46	fn name(&self) -> &str { crate::service::make_name(std::module_path!()) }
47}