diff --git a/src/api/client_server/media.rs b/src/api/client_server/media.rs index 1e753a7a..2c34a24e 100644 --- a/src/api/client_server/media.rs +++ b/src/api/client_server/media.rs @@ -50,8 +50,10 @@ pub async fn create_content_route( ) .await?; + let content_uri = mxc.into(); + Ok(create_content::v3::Response { - content_uri: mxc.try_into()?, + content_uri, blurhash: None, }) } diff --git a/src/api/client_server/membership.rs b/src/api/client_server/membership.rs index e2a14c58..82ed9a2f 100644 --- a/src/api/client_server/membership.rs +++ b/src/api/client_server/membership.rs @@ -722,7 +722,8 @@ async fn join_room_by_id_helper( } info!("Running send_join auth check"); - if !state_res::event_auth::auth_check( + + let auth_check = state_res::event_auth::auth_check( &state_res::RoomVersion::new(&room_version_id).expect("room version is supported"), &parsed_join_pdu, None::, // TODO: third party invite @@ -745,7 +746,9 @@ async fn join_room_by_id_helper( .map_err(|e| { warn!("Auth check failed: {e}"); Error::BadRequest(ErrorKind::InvalidParam, "Auth check failed") - })? { + })?; + + if !auth_check { return Err(Error::BadRequest( ErrorKind::InvalidParam, "Auth check failed", diff --git a/src/api/server_server.rs b/src/api/server_server.rs index a361c848..1dffb481 100644 --- a/src/api/server_server.rs +++ b/src/api/server_server.rs @@ -572,7 +572,7 @@ pub async fn get_server_version_route( Ok(get_server_version::v1::Response { server: Some(get_server_version::v1::Server { - name: Some("cowonduit".to_owned()), + name: Some(env!("CARGO_CRATE_NAME").to_owned()), version: Some(env!("CARGO_PKG_VERSION").to_owned()), }), }) diff --git a/src/config/mod.rs b/src/config/mod.rs index a26b4714..758ad180 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -122,6 +122,7 @@ pub struct TlsConfig { const DEPRECATED_KEYS: &[&str] = &["cache_capacity"]; impl Config { + /// Iterates over all the keys in the config file and warns if there is a deprecated key specified pub fn warn_deprecated(&self) { let mut was_deprecated = false; for key in self @@ -139,16 +140,17 @@ impl Config { } /// Checks the presence of the `address` and `unix_socket_path` keys in the raw_config, exiting the process if both keys were detected. - pub fn error_dual_listening(&self, raw_config: Figment) -> Result<(), ()> { + pub fn is_dual_listening(&self, raw_config: Figment) -> bool { let check_address = raw_config.find_value("address"); let check_unix_socket = raw_config.find_value("unix_socket_path"); + // are the check_address and check_unix_socket keys both Ok (specified) at the same time? if check_address.is_ok() && check_unix_socket.is_ok() { error!("TOML keys \"address\" and \"unix_socket_path\" were both defined. Please specify only one option."); - return Err(()); + return true; } - Ok(()) + false } } diff --git a/src/database/abstraction/watchers.rs b/src/database/abstraction/watchers.rs index 55cb60b3..07087c1f 100644 --- a/src/database/abstraction/watchers.rs +++ b/src/database/abstraction/watchers.rs @@ -6,9 +6,11 @@ use std::{ }; use tokio::sync::watch; +type Watcher = RwLock, (watch::Sender<()>, watch::Receiver<()>)>>; + #[derive(Default)] pub(super) struct Watchers { - watchers: RwLock, (watch::Sender<()>, watch::Receiver<()>)>>, + watchers: Watcher, } impl Watchers { diff --git a/src/database/key_value/account_data.rs b/src/database/key_value/account_data.rs index e1eef966..daa63901 100644 --- a/src/database/key_value/account_data.rs +++ b/src/database/key_value/account_data.rs @@ -6,6 +6,7 @@ use ruma::{ serde::Raw, RoomId, UserId, }; +use tracing::warn; use crate::{database::KeyValueDatabase, service, services, utils, Error, Result}; @@ -123,13 +124,15 @@ impl service::account_data::Data for KeyValueDatabase { .take_while(move |(k, _)| k.starts_with(&prefix)) .map(|(k, v)| { Ok::<_, Error>(( - RoomAccountDataEventType::try_from( + RoomAccountDataEventType::from( utils::string_from_bytes(k.rsplit(|&b| b == 0xff).next().ok_or_else( || Error::bad_database("RoomUserData ID in db is invalid."), )?) - .map_err(|_| Error::bad_database("RoomUserData ID in db is invalid."))?, - ) - .map_err(|_| Error::bad_database("RoomUserData ID in db is invalid."))?, + .map_err(|e| { + warn!("RoomUserData ID in database is invalid: {}", e); + Error::bad_database("RoomUserData ID in db is invalid.") + })?, + ), serde_json::from_slice::>(&v).map_err(|_| { Error::bad_database("Database contains invalid account data.") })?, diff --git a/src/database/key_value/rooms/pdu_metadata.rs b/src/database/key_value/rooms/pdu_metadata.rs index 0641f9d8..ebfba814 100644 --- a/src/database/key_value/rooms/pdu_metadata.rs +++ b/src/database/key_value/rooms/pdu_metadata.rs @@ -4,8 +4,11 @@ use ruma::{EventId, RoomId, UserId}; use crate::{ database::KeyValueDatabase, - service::{self, rooms::timeline::PduCount}, - services, utils, Error, PduEvent, Result, + service::{ + self, + rooms::timeline::{data::PduData, PduCount}, + }, + services, utils, Error, Result, }; impl service::rooms::pdu_metadata::Data for KeyValueDatabase { @@ -22,7 +25,7 @@ impl service::rooms::pdu_metadata::Data for KeyValueDatabase { shortroomid: u64, target: u64, until: PduCount, - ) -> Result> + 'a>> { + ) -> PduData<'a> { let prefix = target.to_be_bytes().to_vec(); let mut current = prefix.clone(); diff --git a/src/database/key_value/rooms/search.rs b/src/database/key_value/rooms/search.rs index ad573f06..9aceaa63 100644 --- a/src/database/key_value/rooms/search.rs +++ b/src/database/key_value/rooms/search.rs @@ -2,6 +2,8 @@ use ruma::RoomId; use crate::{database::KeyValueDatabase, service, services, utils, Result}; +type SearchPdusResult<'a> = Result> + 'a>, Vec)>>; + impl service::rooms::search::Data for KeyValueDatabase { fn index_pdu<'a>(&self, shortroomid: u64, pdu_id: &[u8], message_body: &str) -> Result<()> { let mut batch = message_body @@ -20,11 +22,7 @@ impl service::rooms::search::Data for KeyValueDatabase { self.tokenids.insert_batch(&mut batch) } - fn search_pdus<'a>( - &'a self, - room_id: &RoomId, - search_string: &str, - ) -> Result> + 'a>, Vec)>> { + fn search_pdus<'a>(&'a self, room_id: &RoomId, search_string: &str) -> SearchPdusResult<'a> { let prefix = services() .rooms .short diff --git a/src/database/key_value/rooms/short.rs b/src/database/key_value/rooms/short.rs index c0223170..502557a0 100644 --- a/src/database/key_value/rooms/short.rs +++ b/src/database/key_value/rooms/short.rs @@ -1,6 +1,7 @@ use std::sync::Arc; use ruma::{events::StateEventType, EventId, RoomId}; +use tracing::warn; use crate::{database::KeyValueDatabase, service, services, utils, Error, Result}; @@ -157,10 +158,10 @@ impl service::rooms::short::Data for KeyValueDatabase { .ok_or_else(|| Error::bad_database("Invalid statekey in shortstatekey_statekey."))?; let event_type = - StateEventType::try_from(utils::string_from_bytes(eventtype_bytes).map_err(|_| { - Error::bad_database("Event type in shortstatekey_statekey is invalid unicode.") - })?) - .map_err(|_| Error::bad_database("Event type in shortstatekey_statekey is invalid."))?; + StateEventType::from(utils::string_from_bytes(eventtype_bytes).map_err(|e| { + warn!("Event type in shortstatekey_statekey is invalid: {}", e); + Error::bad_database("Event type in shortstatekey_statekey is invalid.") + })?); let state_key = utils::string_from_bytes(statekey_bytes).map_err(|_| { Error::bad_database("Statekey in shortstatekey_statekey is invalid unicode.") diff --git a/src/database/key_value/rooms/state_cache.rs b/src/database/key_value/rooms/state_cache.rs index d0ea0c2c..7894b0f3 100644 --- a/src/database/key_value/rooms/state_cache.rs +++ b/src/database/key_value/rooms/state_cache.rs @@ -9,6 +9,12 @@ use ruma::{ use crate::{database::KeyValueDatabase, service, services, utils, Error, Result}; +type StrippedStateEventIter<'a> = + Box>)>> + 'a>; + +type AnySyncStateEventIter<'a> = + Box>)>> + 'a>; + impl service::rooms::state_cache::Data for KeyValueDatabase { fn mark_as_once_joined(&self, user_id: &UserId, room_id: &RoomId) -> Result<()> { let mut userroom_id = user_id.as_bytes().to_vec(); @@ -472,10 +478,7 @@ impl service::rooms::state_cache::Data for KeyValueDatabase { /// Returns an iterator over all rooms a user was invited to. #[tracing::instrument(skip(self))] - fn rooms_invited<'a>( - &'a self, - user_id: &UserId, - ) -> Box>)>> + 'a> { + fn rooms_invited<'a>(&'a self, user_id: &UserId) -> StrippedStateEventIter<'a> { let mut prefix = user_id.as_bytes().to_vec(); prefix.push(0xff); @@ -550,10 +553,7 @@ impl service::rooms::state_cache::Data for KeyValueDatabase { /// Returns an iterator over all rooms a user left. #[tracing::instrument(skip(self))] - fn rooms_left<'a>( - &'a self, - user_id: &UserId, - ) -> Box>)>> + 'a> { + fn rooms_left<'a>(&'a self, user_id: &UserId) -> AnySyncStateEventIter<'a> { let mut prefix = user_id.as_bytes().to_vec(); prefix.push(0xff); diff --git a/src/database/key_value/rooms/threads.rs b/src/database/key_value/rooms/threads.rs index 5e3dc970..02176fee 100644 --- a/src/database/key_value/rooms/threads.rs +++ b/src/database/key_value/rooms/threads.rs @@ -4,6 +4,8 @@ use ruma::{api::client::threads::get_threads::v1::IncludeThreads, OwnedUserId, R use crate::{database::KeyValueDatabase, service, services, utils, Error, PduEvent, Result}; +type PduEventIterResult<'a> = Result> + 'a>>; + impl service::rooms::threads::Data for KeyValueDatabase { fn threads_until<'a>( &'a self, @@ -11,7 +13,7 @@ impl service::rooms::threads::Data for KeyValueDatabase { room_id: &'a RoomId, until: u64, _include: &'a IncludeThreads, - ) -> Result> + 'a>> { + ) -> PduEventIterResult<'a> { let prefix = services() .rooms .short diff --git a/src/database/key_value/rooms/timeline.rs b/src/database/key_value/rooms/timeline.rs index f322d430..d097aaf1 100644 --- a/src/database/key_value/rooms/timeline.rs +++ b/src/database/key_value/rooms/timeline.rs @@ -5,7 +5,11 @@ use ruma::{ }; use tracing::error; -use crate::{database::KeyValueDatabase, service, services, utils, Error, PduEvent, Result}; +use crate::{ + database::KeyValueDatabase, + service::{self, rooms::timeline::data::PduData}, + services, utils, Error, PduEvent, Result, +}; use service::rooms::timeline::PduCount; @@ -228,7 +232,7 @@ impl service::rooms::timeline::Data for KeyValueDatabase { user_id: &UserId, room_id: &RoomId, until: PduCount, - ) -> Result> + 'a>> { + ) -> PduData<'a> { let (prefix, current) = count_to_id(room_id, until, 1, true)?; let user_id = user_id.to_owned(); @@ -250,12 +254,7 @@ impl service::rooms::timeline::Data for KeyValueDatabase { )) } - fn pdus_after<'a>( - &'a self, - user_id: &UserId, - room_id: &RoomId, - from: PduCount, - ) -> Result> + 'a>> { + fn pdus_after<'a>(&'a self, user_id: &UserId, room_id: &RoomId, from: PduCount) -> PduData<'a> { let (prefix, current) = count_to_id(room_id, from, 1, false)?; let user_id = user_id.to_owned(); diff --git a/src/database/key_value/users.rs b/src/database/key_value/users.rs index 2b09d684..76e41f1b 100644 --- a/src/database/key_value/users.rs +++ b/src/database/key_value/users.rs @@ -146,10 +146,12 @@ impl service::users::Data for KeyValueDatabase { self.userid_avatarurl .get(user_id.as_bytes())? .map(|bytes| { - let s = utils::string_from_bytes(&bytes) - .map_err(|_| Error::bad_database("Avatar URL in db is invalid."))?; - s.try_into() - .map_err(|_| Error::bad_database("Avatar URL in db is invalid.")) + let s_bytes = utils::string_from_bytes(&bytes).map_err(|e| { + warn!("Avatar URL in db is invalid: {}", e); + Error::bad_database("Avatar URL in db is invalid.") + })?; + let mxc_uri: OwnedMxcUri = s_bytes.into(); + Ok(mxc_uri) }) .transpose() } diff --git a/src/main.rs b/src/main.rs index 88acf002..68674293 100644 --- a/src/main.rs +++ b/src/main.rs @@ -145,7 +145,7 @@ async fn main() { maximize_fd_limit().expect("should be able to increase the soft limit to the hard limit"); config.warn_deprecated(); - if config.error_dual_listening(raw_config).is_err() { + if config.is_dual_listening(raw_config) { return; }; @@ -542,7 +542,7 @@ async fn initial_sync(_uri: Uri) -> impl IntoResponse { } async fn it_works() -> &'static str { - "hewwo from cowonduit woof!" + "hewwo from conduwuit woof!" } /* diff --git a/src/service/globals/mod.rs b/src/service/globals/mod.rs index bb202c67..d41e7e6a 100644 --- a/src/service/globals/mod.rs +++ b/src/service/globals/mod.rs @@ -109,13 +109,15 @@ impl Default for RotationHandler { } } +type DnsOverrides = Box Option + Send + Sync>; + pub struct Resolver { inner: GaiResolver, - overrides: Box Option + Send + Sync>, + overrides: DnsOverrides, } impl Resolver { - pub fn new(overrides: Box Option + Send + Sync>) -> Resolver { + pub fn new(overrides: DnsOverrides) -> Resolver { Resolver { inner: GaiResolver::new(), overrides, diff --git a/src/service/rooms/edus/read_receipt/data.rs b/src/service/rooms/edus/read_receipt/data.rs index a183d196..29b4a986 100644 --- a/src/service/rooms/edus/read_receipt/data.rs +++ b/src/service/rooms/edus/read_receipt/data.rs @@ -1,5 +1,12 @@ use crate::Result; -use ruma::{events::receipt::ReceiptEvent, serde::Raw, OwnedUserId, RoomId, UserId}; +use ruma::{ + events::{receipt::ReceiptEvent, AnySyncEphemeralRoomEvent}, + serde::Raw, + OwnedUserId, RoomId, UserId, +}; + +type AnySyncEphemeralRoomEventIter<'a> = + Box)>> + 'a>; pub trait Data: Send + Sync { /// Replaces the previous read receipt. @@ -11,19 +18,8 @@ pub trait Data: Send + Sync { ) -> Result<()>; /// Returns an iterator over the most recent read_receipts in a room that happened after the event with id `since`. - fn readreceipts_since<'a>( - &'a self, - room_id: &RoomId, - since: u64, - ) -> Box< - dyn Iterator< - Item = Result<( - OwnedUserId, - u64, - Raw, - )>, - > + 'a, - >; + fn readreceipts_since(&self, room_id: &RoomId, since: u64) + -> AnySyncEphemeralRoomEventIter<'_>; /// Sets a private read marker at `count`. fn private_read_set(&self, room_id: &RoomId, user_id: &UserId, count: u64) -> Result<()>; diff --git a/src/service/rooms/event_handler/mod.rs b/src/service/rooms/event_handler/mod.rs index 8d633529..dcadece6 100644 --- a/src/service/rooms/event_handler/mod.rs +++ b/src/service/rooms/event_handler/mod.rs @@ -40,6 +40,11 @@ use crate::{service::*, services, Error, PduEvent, Result}; use super::state_compressor::CompressedStateEvent; +type AsyncRecursiveCanonicalJsonVec<'a> = + AsyncRecursiveType<'a, Vec<(Arc, Option>)>>; +type AsyncRecursiveCanonicalJsonResult<'a> = + AsyncRecursiveType<'a, Result<(Arc, BTreeMap)>>; + pub struct Service; impl Service { @@ -287,7 +292,7 @@ impl Service { mut value: BTreeMap, auth_events_known: bool, pub_key_map: &'a RwLock>>, - ) -> AsyncRecursiveType<'a, Result<(Arc, BTreeMap)>> { + ) -> AsyncRecursiveCanonicalJsonResult<'a> { Box::pin(async move { // 1. Remove unsigned field value.remove("unsigned"); @@ -1022,8 +1027,7 @@ impl Service { room_id: &'a RoomId, room_version_id: &'a RoomVersionId, pub_key_map: &'a RwLock>>, - ) -> AsyncRecursiveType<'a, Vec<(Arc, Option>)>> - { + ) -> AsyncRecursiveCanonicalJsonVec<'a> { Box::pin(async move { let back_off = |id| match services() .globals diff --git a/src/service/rooms/lazy_loading/mod.rs b/src/service/rooms/lazy_loading/mod.rs index e6e4f896..d466231e 100644 --- a/src/service/rooms/lazy_loading/mod.rs +++ b/src/service/rooms/lazy_loading/mod.rs @@ -11,11 +11,13 @@ use crate::Result; use super::timeline::PduCount; +type LazyLoadWaitingMutex = + Mutex>>; + pub struct Service { pub db: &'static dyn Data, - pub lazy_load_waiting: - Mutex>>, + pub lazy_load_waiting: LazyLoadWaitingMutex, } impl Service { diff --git a/src/service/rooms/pdu_metadata/data.rs b/src/service/rooms/pdu_metadata/data.rs index 6c4cb3ce..121d80dc 100644 --- a/src/service/rooms/pdu_metadata/data.rs +++ b/src/service/rooms/pdu_metadata/data.rs @@ -1,6 +1,9 @@ use std::sync::Arc; -use crate::{service::rooms::timeline::PduCount, PduEvent, Result}; +use crate::{ + service::rooms::timeline::{data::PduData, PduCount}, + Result, +}; use ruma::{EventId, RoomId, UserId}; pub trait Data: Send + Sync { @@ -11,7 +14,7 @@ pub trait Data: Send + Sync { room_id: u64, target: u64, until: PduCount, - ) -> Result> + 'a>>; + ) -> PduData<'a>; fn mark_as_referenced(&self, room_id: &RoomId, event_ids: &[Arc]) -> Result<()>; fn is_event_referenced(&self, room_id: &RoomId, event_id: &EventId) -> Result; fn mark_event_soft_failed(&self, event_id: &EventId) -> Result<()>; diff --git a/src/service/rooms/search/data.rs b/src/service/rooms/search/data.rs index 6eef38fb..88fd88e5 100644 --- a/src/service/rooms/search/data.rs +++ b/src/service/rooms/search/data.rs @@ -1,12 +1,10 @@ use crate::Result; use ruma::RoomId; +type SearchPdusResult<'a> = Result> + 'a>, Vec)>>; + pub trait Data: Send + Sync { fn index_pdu(&self, shortroomid: u64, pdu_id: &[u8], message_body: &str) -> Result<()>; - fn search_pdus<'a>( - &'a self, - room_id: &RoomId, - search_string: &str, - ) -> Result> + 'a>, Vec)>>; + fn search_pdus<'a>(&'a self, room_id: &RoomId, search_string: &str) -> SearchPdusResult<'a>; } diff --git a/src/service/rooms/state_cache/data.rs b/src/service/rooms/state_cache/data.rs index d8bb4a44..ed868529 100644 --- a/src/service/rooms/state_cache/data.rs +++ b/src/service/rooms/state_cache/data.rs @@ -7,6 +7,12 @@ use ruma::{ OwnedRoomId, OwnedServerName, OwnedUserId, RoomId, ServerName, UserId, }; +type StrippedStateEventIter<'a> = + Box>)>> + 'a>; + +type AnySyncStateEventIter<'a> = + Box>)>> + 'a>; + pub trait Data: Send + Sync { fn mark_as_once_joined(&self, user_id: &UserId, room_id: &RoomId) -> Result<()>; fn mark_as_joined(&self, user_id: &UserId, room_id: &RoomId) -> Result<()>; @@ -78,10 +84,7 @@ pub trait Data: Send + Sync { ) -> Box> + 'a>; /// Returns an iterator over all rooms a user was invited to. - fn rooms_invited<'a>( - &'a self, - user_id: &UserId, - ) -> Box>)>> + 'a>; + fn rooms_invited<'a>(&'a self, user_id: &UserId) -> StrippedStateEventIter<'a>; fn invite_state( &self, @@ -96,10 +99,7 @@ pub trait Data: Send + Sync { ) -> Result>>>; /// Returns an iterator over all rooms a user left. - fn rooms_left<'a>( - &'a self, - user_id: &UserId, - ) -> Box>)>> + 'a>; + fn rooms_left<'a>(&'a self, user_id: &UserId) -> AnySyncStateEventIter<'a>; fn once_joined(&self, user_id: &UserId, room_id: &RoomId) -> Result; diff --git a/src/service/rooms/state_compressor/mod.rs b/src/service/rooms/state_compressor/mod.rs index b0ede3ee..338249f6 100644 --- a/src/service/rooms/state_compressor/mod.rs +++ b/src/service/rooms/state_compressor/mod.rs @@ -13,20 +13,44 @@ use crate::{services, utils, Result}; use self::data::StateDiff; +type StateInfoLruCache = Mutex< + LruCache< + u64, + Vec<( + u64, // sstatehash + Arc>, // full state + Arc>, // added + Arc>, // removed + )>, + >, +>; + +type ShortStateInfoResult = Result< + Vec<( + u64, // sstatehash + Arc>, // full state + Arc>, // added + Arc>, // removed + )>, +>; + +type ParentStatesVec = Vec<( + u64, // sstatehash + Arc>, // full state + Arc>, // added + Arc>, // removed +)>; + +type HashSetCompressStateEvent = Result<( + u64, + Arc>, + Arc>, +)>; + pub struct Service { pub db: &'static dyn Data, - pub stateinfo_cache: Mutex< - LruCache< - u64, - Vec<( - u64, // sstatehash - Arc>, // full state - Arc>, // added - Arc>, // removed - )>, - >, - >, + pub stateinfo_cache: StateInfoLruCache, } pub type CompressedStateEvent = [u8; 2 * size_of::()]; @@ -34,17 +58,7 @@ pub type CompressedStateEvent = [u8; 2 * size_of::()]; impl Service { /// Returns a stack with info on shortstatehash, full state, added diff and removed diff for the selected shortstatehash and each parent layer. #[tracing::instrument(skip(self))] - pub fn load_shortstatehash_info( - &self, - shortstatehash: u64, - ) -> Result< - Vec<( - u64, // sstatehash - Arc>, // full state - Arc>, // added - Arc>, // removed - )>, - > { + pub fn load_shortstatehash_info(&self, shortstatehash: u64) -> ShortStateInfoResult { if let Some(r) = self .stateinfo_cache .lock() @@ -144,12 +158,7 @@ impl Service { statediffnew: Arc>, statediffremoved: Arc>, diff_to_sibling: usize, - mut parent_states: Vec<( - u64, // sstatehash - Arc>, // full state - Arc>, // added - Arc>, // removed - )>, + mut parent_states: ParentStatesVec, ) -> Result<()> { let diffsum = statediffnew.len() + statediffremoved.len(); @@ -257,11 +266,7 @@ impl Service { &self, room_id: &RoomId, new_state_ids_compressed: Arc>, - ) -> Result<( - u64, - Arc>, - Arc>, - )> { + ) -> HashSetCompressStateEvent { let previous_shortstatehash = services().rooms.state.get_room_shortstatehash(room_id)?; let state_hash = utils::calculate_hash( diff --git a/src/service/rooms/threads/data.rs b/src/service/rooms/threads/data.rs index 9221e8e8..2f062e23 100644 --- a/src/service/rooms/threads/data.rs +++ b/src/service/rooms/threads/data.rs @@ -1,6 +1,8 @@ use crate::{PduEvent, Result}; use ruma::{api::client::threads::get_threads::v1::IncludeThreads, OwnedUserId, RoomId, UserId}; +type PduEventIterResult<'a> = Result> + 'a>>; + pub trait Data: Send + Sync { fn threads_until<'a>( &'a self, @@ -8,7 +10,7 @@ pub trait Data: Send + Sync { room_id: &'a RoomId, until: u64, include: &'a IncludeThreads, - ) -> Result> + 'a>>; + ) -> PduEventIterResult<'a>; fn update_participants(&self, root_id: &[u8], participants: &[OwnedUserId]) -> Result<()>; fn get_participants(&self, root_id: &[u8]) -> Result>>; diff --git a/src/service/rooms/timeline/data.rs b/src/service/rooms/timeline/data.rs index afa2cfbf..df329fec 100644 --- a/src/service/rooms/timeline/data.rs +++ b/src/service/rooms/timeline/data.rs @@ -6,6 +6,8 @@ use crate::{PduEvent, Result}; use super::PduCount; +pub type PduData<'a> = Result> + 'a>>; + pub trait Data: Send + Sync { fn last_timeline_count(&self, sender_user: &UserId, room_id: &RoomId) -> Result; @@ -66,21 +68,12 @@ pub trait Data: Send + Sync { /// Returns an iterator over all events and their tokens in a room that happened before the /// event with id `until` in reverse-chronological order. - fn pdus_until<'a>( - &'a self, - user_id: &UserId, - room_id: &RoomId, - until: PduCount, - ) -> Result> + 'a>>; + fn pdus_until<'a>(&'a self, user_id: &UserId, room_id: &RoomId, until: PduCount) + -> PduData<'a>; /// Returns an iterator over all events in a room that happened after the event with id `from` /// in chronological order. - fn pdus_after<'a>( - &'a self, - user_id: &UserId, - room_id: &RoomId, - from: PduCount, - ) -> Result> + 'a>>; + fn pdus_after<'a>(&'a self, user_id: &UserId, room_id: &RoomId, from: PduCount) -> PduData<'a>; fn increment_notification_counts( &self, diff --git a/src/service/rooms/timeline/mod.rs b/src/service/rooms/timeline/mod.rs index 048ffe9a..5133015a 100644 --- a/src/service/rooms/timeline/mod.rs +++ b/src/service/rooms/timeline/mod.rs @@ -1,4 +1,4 @@ -mod data; +pub(crate) mod data; use std::{ cmp::Ordering, diff --git a/src/service/sending/data.rs b/src/service/sending/data.rs index 2e574e23..427ee939 100644 --- a/src/service/sending/data.rs +++ b/src/service/sending/data.rs @@ -4,14 +4,13 @@ use crate::Result; use super::{OutgoingKind, SendingEventType}; +type OutgoingSendingIter<'a> = + Box, OutgoingKind, SendingEventType)>> + 'a>; +type SendingEventTypeIter<'a> = Box, SendingEventType)>> + 'a>; + pub trait Data: Send + Sync { - fn active_requests<'a>( - &'a self, - ) -> Box, OutgoingKind, SendingEventType)>> + 'a>; - fn active_requests_for<'a>( - &'a self, - outgoing_kind: &OutgoingKind, - ) -> Box, SendingEventType)>> + 'a>; + fn active_requests(&self) -> OutgoingSendingIter<'_>; + fn active_requests_for(&self, outgoing_kind: &OutgoingKind) -> SendingEventTypeIter<'_>; fn delete_active_request(&self, key: Vec) -> Result<()>; fn delete_all_active_requests_for(&self, outgoing_kind: &OutgoingKind) -> Result<()>; fn delete_all_requests_for(&self, outgoing_kind: &OutgoingKind) -> Result<()>; diff --git a/src/service/users/mod.rs b/src/service/users/mod.rs index 6299b9ea..10578679 100644 --- a/src/service/users/mod.rs +++ b/src/service/users/mod.rs @@ -32,10 +32,12 @@ pub struct SlidingSyncCache { extensions: ExtensionsConfig, } +type DbConnections = + Mutex>>>; + pub struct Service { pub db: &'static dyn Data, - pub connections: - Mutex>>>, + pub connections: DbConnections, } impl Service {