implement several broadband loops

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk 2024-12-04 00:00:40 +00:00
parent 59d5e3ebf1
commit 1d02851028
7 changed files with 47 additions and 22 deletions

View file

@ -1,10 +1,10 @@
use axum::extract::State;
use conduit::{
at,
utils::{result::FlatOk, IterStream, ReadyExt},
utils::{result::FlatOk, stream::WidebandExt, IterStream, ReadyExt},
PduCount, Result,
};
use futures::{FutureExt, StreamExt};
use futures::StreamExt;
use ruma::{
api::{
client::relations::{
@ -138,11 +138,10 @@ async fn paginate_relations_with_filter(
.is_none_or(|rel_type| pdu.relation_type_equal(rel_type))
})
.stream()
.filter_map(|item| visibility_filter(services, sender_user, item))
.ready_take_while(|(count, _)| Some(*count) != to)
.wide_filter_map(|item| visibility_filter(services, sender_user, item))
.take(limit)
.collect()
.boxed()
.await;
let next_batch = match dir {

View file

@ -1,7 +1,10 @@
mod v3;
mod v4;
use conduit::{utils::ReadyExt, PduCount};
use conduit::{
utils::stream::{BroadbandExt, ReadyExt},
PduCount,
};
use futures::StreamExt;
use ruma::{RoomId, UserId};
@ -55,7 +58,7 @@ async fn share_encrypted_room(
.state_cache
.get_shared_rooms(sender_user, user_id)
.ready_filter(|&room_id| Some(room_id) != ignore_room)
.any(|other_room_id| {
.broad_any(|other_room_id| {
services
.rooms
.state_accessor

View file

@ -3,7 +3,12 @@
use std::{borrow::Borrow, collections::HashMap};
use axum::extract::State;
use conduit::{err, pdu::gen_event_id_canonical_json, utils::IterStream, warn, Error, Result};
use conduit::{
err,
pdu::gen_event_id_canonical_json,
utils::stream::{IterStream, TryBroadbandExt},
warn, Error, Result,
};
use futures::{FutureExt, StreamExt, TryStreamExt};
use ruma::{
api::{client::error::ErrorKind, federation::membership::create_join_event},
@ -160,6 +165,7 @@ async fn create_join_event(
.rooms
.event_handler
.handle_incoming_pdu(&origin, room_id, &event_id, value.clone(), true)
.boxed()
.await?
.ok_or_else(|| err!(Request(InvalidParam("Could not accept as timeline event."))))?;
@ -172,16 +178,17 @@ async fn create_join_event(
.await?;
let state = state_ids
.iter()
.values()
.try_stream()
.and_then(|(_, event_id)| services.rooms.timeline.get_pdu_json(event_id))
.and_then(|pdu| {
.broad_and_then(|event_id| services.rooms.timeline.get_pdu_json(event_id))
.broad_and_then(|pdu| {
services
.sending
.convert_to_outgoing_federation_event(pdu)
.map(Ok)
})
.try_collect()
.boxed()
.await?;
let starting_events = state_ids.values().map(Borrow::borrow);
@ -191,14 +198,15 @@ async fn create_join_event(
.event_ids_iter(room_id, starting_events)
.await?
.map(Ok)
.and_then(|event_id| async move { services.rooms.timeline.get_pdu_json(&event_id).await })
.and_then(|pdu| {
.broad_and_then(|event_id| async move { services.rooms.timeline.get_pdu_json(&event_id).await })
.broad_and_then(|pdu| {
services
.sending
.convert_to_outgoing_federation_event(pdu)
.map(Ok)
})
.try_collect()
.boxed()
.await?;
services.sending.send_pdu_room(room_id, &pdu_id).await?;