optimize statekey-from-short loopsite

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk 2025-01-14 19:17:45 +00:00
parent 3dae02b886
commit ac944496c1

View file

@ -6,10 +6,10 @@ use std::{
use conduwuit::{ use conduwuit::{
debug, err, implement, debug, err, implement,
utils::stream::{automatic_width, IterStream, WidebandExt}, utils::stream::{automatic_width, IterStream, ReadyExt, WidebandExt},
Result, Result,
}; };
use futures::{FutureExt, StreamExt, TryFutureExt}; use futures::{FutureExt, StreamExt};
use ruma::{ use ruma::{
state_res::{self, StateMap}, state_res::{self, StateMap},
OwnedEventId, RoomId, RoomVersionId, OwnedEventId, RoomId, RoomVersionId,
@ -59,17 +59,18 @@ pub async fn resolve_state(
let fork_states: Vec<StateMap<OwnedEventId>> = fork_states let fork_states: Vec<StateMap<OwnedEventId>> = fork_states
.into_iter() .into_iter()
.stream() .stream()
.wide_then(|fork_state| { .wide_then(|fork_state| async move {
fork_state let shortstatekeys = fork_state.keys().copied().stream();
.into_iter()
.stream() let event_ids = fork_state.values().cloned().stream().boxed();
.wide_filter_map(|(k, id)| {
self.services self.services
.short .short
.get_statekey_from_short(k) .multi_get_statekey_from_short(shortstatekeys)
.map_ok_or_else(|_| None, move |(ty, st_key)| Some(((ty, st_key), id))) .zip(event_ids)
}) .ready_filter_map(|(ty_sk, id)| Some((ty_sk.ok()?, id)))
.collect() .collect()
.await
}) })
.collect() .collect()
.await; .await;