From 3968d038683592745799caca89e00e5547b6fde8 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Wed, 20 Nov 2024 20:21:31 +0000 Subject: [PATCH] move and improve common-rooms related Signed-off-by: Jason Volk --- src/api/client/presence.rs | 4 ++-- src/api/client/sync/mod.rs | 2 +- src/api/client/unstable.rs | 2 +- src/api/client/user_directory.rs | 4 ++-- src/service/rooms/state_cache/mod.rs | 25 +++++++++++++++---------- src/service/rooms/user/mod.rs | 22 ---------------------- 6 files changed, 21 insertions(+), 38 deletions(-) diff --git a/src/api/client/presence.rs b/src/api/client/presence.rs index ba48808b..948d6caa 100644 --- a/src/api/client/presence.rs +++ b/src/api/client/presence.rs @@ -52,8 +52,8 @@ pub(crate) async fn get_presence_route( let has_shared_rooms = services .rooms - .user - .has_shared_rooms(sender_user, &body.user_id) + .state_cache + .user_sees_user(sender_user, &body.user_id) .await; if has_shared_rooms { diff --git a/src/api/client/sync/mod.rs b/src/api/client/sync/mod.rs index a9715b84..ba50d77c 100644 --- a/src/api/client/sync/mod.rs +++ b/src/api/client/sync/mod.rs @@ -52,7 +52,7 @@ async fn share_encrypted_room( ) -> bool { services .rooms - .user + .state_cache .get_shared_rooms(sender_user, user_id) .ready_filter(|&room_id| Some(room_id) != ignore_room) .any(|other_room_id| { diff --git a/src/api/client/unstable.rs b/src/api/client/unstable.rs index dc570295..5de41f44 100644 --- a/src/api/client/unstable.rs +++ b/src/api/client/unstable.rs @@ -55,7 +55,7 @@ pub(crate) async fn get_mutual_rooms_route( let mutual_rooms: Vec = services .rooms - .user + .state_cache .get_shared_rooms(sender_user, &body.user_id) .map(ToOwned::to_owned) .collect() diff --git a/src/api/client/user_directory.rs b/src/api/client/user_directory.rs index 868811a3..f3fee8d1 100644 --- a/src/api/client/user_directory.rs +++ b/src/api/client/user_directory.rs @@ -71,8 +71,8 @@ pub(crate) async fn search_users_route( } else { let user_is_in_shared_rooms = services .rooms - .user - .has_shared_rooms(sender_user, &user.user_id) + .state_cache + .user_sees_user(sender_user, &user.user_id) .await; if user_is_in_shared_rooms { diff --git a/src/service/rooms/state_cache/mod.rs b/src/service/rooms/state_cache/mod.rs index 6e330fdc..156345fe 100644 --- a/src/service/rooms/state_cache/mod.rs +++ b/src/service/rooms/state_cache/mod.rs @@ -10,7 +10,7 @@ use conduit::{ warn, Result, }; use database::{serialize_to_vec, Deserialized, Ignore, Interfix, Json, Map}; -use futures::{future::join4, stream::iter, Stream, StreamExt}; +use futures::{future::join4, pin_mut, stream::iter, Stream, StreamExt}; use itertools::Itertools; use ruma::{ events::{ @@ -385,16 +385,21 @@ impl Service { /// Returns true if user_a and user_b share at least one room. #[tracing::instrument(skip(self), level = "debug")] pub async fn user_sees_user(&self, user_a: &UserId, user_b: &UserId) -> bool { - // Minimize number of point-queries by iterating user with least nr rooms - let (a, b) = if self.rooms_joined(user_a).count().await < self.rooms_joined(user_b).count().await { - (user_a, user_b) - } else { - (user_b, user_a) - }; + let get_shared_rooms = self.get_shared_rooms(user_a, user_b); - self.rooms_joined(a) - .any(|room_id| self.is_joined(b, room_id)) - .await + pin_mut!(get_shared_rooms); + get_shared_rooms.next().await.is_some() + } + + /// List the rooms common between two users + pub fn get_shared_rooms<'a>( + &'a self, user_a: &'a UserId, user_b: &'a UserId, + ) -> impl Stream + Send + 'a { + use conduit::utils::set; + + let a = self.rooms_joined(user_a); + let b = self.rooms_joined(user_b); + set::intersection_sorted_stream2(a, b) } /// Returns an iterator of all joined members of a room. diff --git a/src/service/rooms/user/mod.rs b/src/service/rooms/user/mod.rs index 99587134..948baa5e 100644 --- a/src/service/rooms/user/mod.rs +++ b/src/service/rooms/user/mod.rs @@ -2,7 +2,6 @@ use std::sync::Arc; use conduit::{implement, Result}; use database::{Deserialized, Map}; -use futures::{pin_mut, Stream, StreamExt}; use ruma::{RoomId, UserId}; use crate::{globals, rooms, rooms::short::ShortStateHash, Dep}; @@ -22,7 +21,6 @@ struct Data { struct Services { globals: Dep, short: Dep, - state_cache: Dep, } impl crate::Service for Service { @@ -38,7 +36,6 @@ impl crate::Service for Service { services: Services { globals: args.depend::("globals"), short: args.depend::("rooms::short"), - state_cache: args.depend::("rooms::state_cache"), }, })) } @@ -118,22 +115,3 @@ pub async fn get_token_shortstatehash(&self, room_id: &RoomId, token: u64) -> Re .await .deserialized() } - -#[implement(Service)] -pub async fn has_shared_rooms<'a>(&'a self, user_a: &'a UserId, user_b: &'a UserId) -> bool { - let get_shared_rooms = self.get_shared_rooms(user_a, user_b); - - pin_mut!(get_shared_rooms); - get_shared_rooms.next().await.is_some() -} - -//TODO: optimize; replace point-queries with dual iteration -#[implement(Service)] -pub fn get_shared_rooms<'a>( - &'a self, user_a: &'a UserId, user_b: &'a UserId, -) -> impl Stream + Send + 'a { - self.services - .state_cache - .rooms_joined(user_a) - .filter(|room_id| self.services.state_cache.is_joined(user_b, room_id)) -}