mirror of
https://gitlab.com/famedly/conduit.git
synced 2025-07-27 17:28:36 +00:00
PoC
This commit is contained in:
parent
1f313c6807
commit
40699c395a
6 changed files with 88 additions and 5 deletions
|
@ -1,9 +1,11 @@
|
|||
mod data;
|
||||
pub use data::{Data, SigningKeys};
|
||||
|
||||
use ruma::{
|
||||
serde::Base64, MilliSecondsSinceUnixEpoch, OwnedDeviceId, OwnedEventId, OwnedRoomAliasId,
|
||||
OwnedRoomId, OwnedServerName, OwnedUserId, RoomAliasId,
|
||||
};
|
||||
use tokio::sync::OnceCell;
|
||||
|
||||
use crate::api::server_server::DestinationResponse;
|
||||
|
||||
|
@ -17,7 +19,7 @@ use ruma::{
|
|||
DeviceId, RoomVersionId, ServerName, UserId,
|
||||
};
|
||||
use std::{
|
||||
collections::{BTreeMap, HashMap},
|
||||
collections::{BTreeMap, BTreeSet, HashMap},
|
||||
error::Error as StdError,
|
||||
fs,
|
||||
future::{self, Future},
|
||||
|
@ -33,7 +35,7 @@ use std::{
|
|||
};
|
||||
use tokio::sync::{broadcast, watch::Receiver, Mutex, RwLock, Semaphore};
|
||||
use tower_service::Service as TowerService;
|
||||
use tracing::{error, info};
|
||||
use tracing::{error, info, warn};
|
||||
|
||||
use base64::{engine::general_purpose, Engine as _};
|
||||
|
||||
|
@ -68,6 +70,7 @@ pub struct Service {
|
|||
pub roomid_mutex_state: RwLock<HashMap<OwnedRoomId, Arc<Mutex<()>>>>,
|
||||
pub roomid_mutex_federation: RwLock<HashMap<OwnedRoomId, Arc<Mutex<()>>>>, // this lock will be held longer
|
||||
pub roomid_federationhandletime: RwLock<HashMap<OwnedRoomId, (OwnedEventId, Instant)>>,
|
||||
join_by_default: OnceCell<BTreeSet<OwnedRoomId>>,
|
||||
server_user: OwnedUserId,
|
||||
admin_alias: OwnedRoomAliasId,
|
||||
pub stateres_mutex: Arc<Mutex<()>>,
|
||||
|
@ -221,6 +224,7 @@ impl Service {
|
|||
roomid_mutex_insert: RwLock::new(HashMap::new()),
|
||||
roomid_mutex_federation: RwLock::new(HashMap::new()),
|
||||
roomid_federationhandletime: RwLock::new(HashMap::new()),
|
||||
join_by_default: OnceCell::new(),
|
||||
stateres_mutex: Arc::new(Mutex::new(())),
|
||||
sync_receivers: RwLock::new(HashMap::new()),
|
||||
rotate: RotationHandler::new(),
|
||||
|
@ -505,6 +509,49 @@ impl Service {
|
|||
self.config.well_known_client()
|
||||
}
|
||||
|
||||
pub fn join_by_default(&self) -> Result<&BTreeSet<OwnedRoomId>> {
|
||||
if let Some(set) = self.join_by_default.get() {
|
||||
return Ok(set);
|
||||
}
|
||||
|
||||
let server_name = self.config.server_name.as_str();
|
||||
let mut join_by_default = BTreeSet::new();
|
||||
|
||||
for s in self.config.join_by_default.iter().cloned() {
|
||||
let next = s
|
||||
.chars()
|
||||
.next()
|
||||
.ok_or_else(|| Error::bad_config("Invalid room ID for join-by-default."))?;
|
||||
|
||||
let room_id = if next == '!' {
|
||||
let id = s.split(':').next().unwrap_or(&s);
|
||||
|
||||
OwnedRoomId::from_str(&format!("{id}:{server_name}",))
|
||||
.map_err(|_| Error::bad_config("Invalid room ID for join-by-default rooms."))?
|
||||
} else {
|
||||
let id = s.split(':').next().unwrap_or(&s).trim_start_matches('#');
|
||||
|
||||
let alias = OwnedRoomAliasId::from_str(&format!("#{id}:{server_name}",))
|
||||
.map_err(|_| Error::bad_config("Invalid room alias for join-by-default."))?;
|
||||
|
||||
let Some(room_id) = services().rooms.alias.resolve_local_alias(&alias)? else {
|
||||
warn!("Could not resolve Room ID for join-by-default rooms locally.");
|
||||
continue;
|
||||
};
|
||||
|
||||
room_id
|
||||
};
|
||||
|
||||
join_by_default.insert(room_id);
|
||||
}
|
||||
|
||||
self.join_by_default
|
||||
.set(join_by_default)
|
||||
.expect("join_by_default should be set once");
|
||||
|
||||
self.join_by_default()
|
||||
}
|
||||
|
||||
pub fn shutdown(&self) {
|
||||
self.shutdown.store(true, atomic::Ordering::Relaxed);
|
||||
// On shutdown
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue