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
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}