Introduce OptionFuture helpers
Optimize user directory searches
This commit is contained in:
@@ -1,7 +1,4 @@
|
||||
use futures::{
|
||||
FutureExt, TryFutureExt, TryStreamExt,
|
||||
future::{OptionFuture, try_join5},
|
||||
};
|
||||
use futures::{FutureExt, TryFutureExt, TryStreamExt, future::try_join5};
|
||||
use ruma::{CanonicalJsonObject, EventId, RoomId, ServerName, UserId, events::StateEventType};
|
||||
use tuwunel_core::{
|
||||
Err, Result, debug,
|
||||
@@ -9,7 +6,7 @@ use tuwunel_core::{
|
||||
err, implement,
|
||||
matrix::{Event, room_version},
|
||||
trace,
|
||||
utils::stream::IterStream,
|
||||
utils::{BoolExt, stream::IterStream},
|
||||
warn,
|
||||
};
|
||||
|
||||
@@ -83,11 +80,10 @@ pub async fn handle_incoming_pdu<'a>(
|
||||
.try_into()
|
||||
.map_err(|e| err!(Request(InvalidParam("PDU does not have a valid sender key: {e}"))))?;
|
||||
|
||||
let sender_acl_check: OptionFuture<_> = sender
|
||||
let sender_acl_check = sender
|
||||
.server_name()
|
||||
.ne(origin)
|
||||
.then(|| self.acl_check(sender.server_name(), room_id))
|
||||
.into();
|
||||
.then_async(|| self.acl_check(sender.server_name(), room_id));
|
||||
|
||||
// Fetch create event
|
||||
let create_event =
|
||||
|
||||
@@ -3,16 +3,16 @@ use std::{
|
||||
iter::{Iterator, once},
|
||||
};
|
||||
|
||||
use futures::{
|
||||
FutureExt, StreamExt, TryFutureExt, TryStreamExt,
|
||||
future::{OptionFuture, try_join},
|
||||
};
|
||||
use futures::{FutureExt, StreamExt, TryFutureExt, TryStreamExt, future::try_join};
|
||||
use ruma::{OwnedEventId, RoomId, RoomVersionId};
|
||||
use tuwunel_core::{
|
||||
Result, apply, err, implement,
|
||||
matrix::{Event, StateMap, state_res::AuthSet},
|
||||
ref_at, trace,
|
||||
utils::stream::{BroadbandExt, IterStream, ReadyExt, TryBroadbandExt, TryWidebandExt},
|
||||
utils::{
|
||||
option::OptionExt,
|
||||
stream::{BroadbandExt, IterStream, ReadyExt, TryBroadbandExt, TryWidebandExt},
|
||||
},
|
||||
};
|
||||
|
||||
use crate::rooms::short::ShortStateHash;
|
||||
@@ -174,16 +174,15 @@ async fn state_at_incoming_fork<Pdu>(
|
||||
where
|
||||
Pdu: Event,
|
||||
{
|
||||
let leaf: OptionFuture<_> = prev_event
|
||||
let leaf = prev_event
|
||||
.state_key()
|
||||
.map(async |state_key| {
|
||||
.map_async(async |state_key| {
|
||||
self.services
|
||||
.short
|
||||
.get_or_create_shortstatekey(&prev_event.kind().to_cow_str().into(), state_key)
|
||||
.map(|shortstatekey| once((shortstatekey, prev_event.event_id().to_owned())))
|
||||
.await
|
||||
})
|
||||
.into();
|
||||
});
|
||||
|
||||
let leaf_state_after_event: Vec<_> = self
|
||||
.services
|
||||
|
||||
@@ -6,11 +6,7 @@ use std::{
|
||||
sync::{Arc, RwLock},
|
||||
};
|
||||
|
||||
use futures::{
|
||||
Stream, StreamExt,
|
||||
future::{OptionFuture, join5},
|
||||
pin_mut,
|
||||
};
|
||||
use futures::{Stream, StreamExt, future::join5, pin_mut};
|
||||
use ruma::{
|
||||
OwnedRoomId, RoomId, ServerName, UserId,
|
||||
events::{AnyStrippedStateEvent, AnySyncStateEvent, room::member::MembershipState},
|
||||
@@ -21,6 +17,7 @@ use tuwunel_core::{
|
||||
result::LogErr,
|
||||
trace,
|
||||
utils::{
|
||||
BoolExt,
|
||||
future::OptionStream,
|
||||
stream::{BroadbandExt, ReadyExt, TryIgnore},
|
||||
},
|
||||
@@ -411,45 +408,41 @@ pub fn user_memberships<'a>(
|
||||
use MembershipState::*;
|
||||
use futures::stream::select;
|
||||
|
||||
let joined: OptionFuture<_> = mask
|
||||
let joined = mask
|
||||
.is_none_or(|mask| mask.contains(&Join))
|
||||
.then(|| {
|
||||
.then_async(|| {
|
||||
self.rooms_joined(user_id)
|
||||
.map(|room_id| (Join, room_id))
|
||||
.boxed()
|
||||
.into_future()
|
||||
})
|
||||
.into();
|
||||
});
|
||||
|
||||
let invited: OptionFuture<_> = mask
|
||||
let invited = mask
|
||||
.is_none_or(|mask| mask.contains(&Invite))
|
||||
.then(|| {
|
||||
.then_async(|| {
|
||||
self.rooms_invited(user_id)
|
||||
.map(|room_id| (Invite, room_id))
|
||||
.boxed()
|
||||
.into_future()
|
||||
})
|
||||
.into();
|
||||
});
|
||||
|
||||
let knocked: OptionFuture<_> = mask
|
||||
let knocked = mask
|
||||
.is_none_or(|mask| mask.contains(&Knock))
|
||||
.then(|| {
|
||||
.then_async(|| {
|
||||
self.rooms_knocked(user_id)
|
||||
.map(|room_id| (Knock, room_id))
|
||||
.boxed()
|
||||
.into_future()
|
||||
})
|
||||
.into();
|
||||
});
|
||||
|
||||
let left: OptionFuture<_> = mask
|
||||
let left = mask
|
||||
.is_none_or(|mask| mask.contains(&Leave))
|
||||
.then(|| {
|
||||
.then_async(|| {
|
||||
self.rooms_left(user_id)
|
||||
.map(|room_id| (Leave, room_id))
|
||||
.boxed()
|
||||
.into_future()
|
||||
})
|
||||
.into();
|
||||
});
|
||||
|
||||
select(
|
||||
select(joined.stream(), left.stream()),
|
||||
|
||||
Reference in New Issue
Block a user