tuwunel_service/resolver/
mod.rs1pub 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}