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