|
|
|
@ -1027,42 +1027,37 @@ pub fn handle_incoming_pdu<'a>(
|
|
|
|
|
.map_err(|_| "Failed talking to db".to_owned())?
|
|
|
|
|
.map(|shortstatehash| db.rooms.state_full_ids(shortstatehash).ok())
|
|
|
|
|
.flatten();
|
|
|
|
|
if let Some(mut state) = state {
|
|
|
|
|
if db
|
|
|
|
|
.rooms
|
|
|
|
|
.get_pdu(prev_event)
|
|
|
|
|
.ok()
|
|
|
|
|
.flatten()
|
|
|
|
|
.ok_or_else(|| "Could not find prev event, but we know the state.".to_owned())?
|
|
|
|
|
.state_key
|
|
|
|
|
.is_some()
|
|
|
|
|
{
|
|
|
|
|
state.insert(prev_event.clone());
|
|
|
|
|
}
|
|
|
|
|
state_at_incoming_event = Some(
|
|
|
|
|
fetch_and_handle_events(
|
|
|
|
|
db,
|
|
|
|
|
origin,
|
|
|
|
|
&state.into_iter().collect::<Vec<_>>(),
|
|
|
|
|
&room_id,
|
|
|
|
|
pub_key_map,
|
|
|
|
|
)
|
|
|
|
|
.await
|
|
|
|
|
.map_err(|_| "Failed to fetch state events locally".to_owned())?
|
|
|
|
|
.into_iter()
|
|
|
|
|
.map(|pdu| {
|
|
|
|
|
if let Some(state) = state {
|
|
|
|
|
let mut state = fetch_and_handle_events(
|
|
|
|
|
db,
|
|
|
|
|
origin,
|
|
|
|
|
&state.into_iter().collect::<Vec<_>>(),
|
|
|
|
|
&room_id,
|
|
|
|
|
pub_key_map,
|
|
|
|
|
)
|
|
|
|
|
.await
|
|
|
|
|
.map_err(|_| "Failed to fetch state events locally".to_owned())?
|
|
|
|
|
.into_iter()
|
|
|
|
|
.map(|pdu| {
|
|
|
|
|
(
|
|
|
|
|
(
|
|
|
|
|
(
|
|
|
|
|
pdu.kind.clone(),
|
|
|
|
|
pdu.state_key
|
|
|
|
|
.clone()
|
|
|
|
|
.expect("events from state_full_ids are state events"),
|
|
|
|
|
),
|
|
|
|
|
pdu,
|
|
|
|
|
)
|
|
|
|
|
})
|
|
|
|
|
.collect(),
|
|
|
|
|
);
|
|
|
|
|
pdu.kind.clone(),
|
|
|
|
|
pdu.state_key
|
|
|
|
|
.clone()
|
|
|
|
|
.expect("events from state_full_ids are state events"),
|
|
|
|
|
),
|
|
|
|
|
pdu,
|
|
|
|
|
)
|
|
|
|
|
})
|
|
|
|
|
.collect::<HashMap<_, _>>();
|
|
|
|
|
|
|
|
|
|
let prev_pdu = db.rooms.get_pdu(prev_event).ok().flatten().ok_or_else(|| {
|
|
|
|
|
"Could not find prev event, but we know the state.".to_owned()
|
|
|
|
|
})?;
|
|
|
|
|
|
|
|
|
|
if let Some(state_key) = &prev_pdu.state_key {
|
|
|
|
|
state.insert((prev_pdu.kind.clone(), state_key.clone()), prev_pdu);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// TODO: set incoming_auth_events?
|
|
|
|
|
}
|
|
|
|
|