Introduce OptionFuture helpers

Optimize user directory searches
This commit is contained in:
dasha_uwu
2026-01-17 05:38:09 +05:00
committed by Jason Volk
parent 95121ad905
commit e78bf21085
28 changed files with 454 additions and 567 deletions

View File

@@ -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 =

View File

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

View File

@@ -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()),