From 393eef431b978228127534c65e00abac647d482d Mon Sep 17 00:00:00 2001
From: morguldir <morguldir@protonmail.com>
Date: Sat, 31 Aug 2024 18:58:39 +0200
Subject: [PATCH] syncv3: avoid fetching timelines for invites

---
 src/api/client/sync.rs | 38 +++++++++++++++++++++++---------------
 1 file changed, 23 insertions(+), 15 deletions(-)

diff --git a/src/api/client/sync.rs b/src/api/client/sync.rs
index 236b85dd..4d080758 100644
--- a/src/api/client/sync.rs
+++ b/src/api/client/sync.rs
@@ -1,6 +1,5 @@
 use std::{
-	cmp,
-	cmp::Ordering,
+	cmp::{self, Ordering},
 	collections::{hash_map::Entry, BTreeMap, BTreeSet, HashMap, HashSet},
 	time::Duration,
 };
@@ -1501,8 +1500,28 @@ pub(crate) async fn sync_events_v4_route(
 	for (room_id, (required_state_request, timeline_limit, roomsince)) in &todo_rooms {
 		let roomsincecount = PduCount::Normal(*roomsince);
 
-		let (timeline_pdus, limited) =
-			load_timeline(&services, &sender_user, room_id, roomsincecount, *timeline_limit)?;
+		let mut timestamp: Option<_> = None;
+		let mut invite_state = None;
+		let (timeline_pdus, limited);
+		if all_invited_rooms.contains(room_id) {
+			// TODO: figure out a timestamp we can use for remote invites
+			invite_state = services
+				.rooms
+				.state_cache
+				.invite_state(&sender_user, room_id)
+				.unwrap_or(None);
+
+			(timeline_pdus, limited) = (Vec::new(), true);
+		} else {
+			(timeline_pdus, limited) =
+				match load_timeline(&services, &sender_user, room_id, roomsincecount, *timeline_limit) {
+					Ok(value) => value,
+					Err(err) => {
+						warn!("Encountered missing timeline in {}, error {}", room_id, err);
+						continue;
+					},
+				};
+		}
 
 		account_data.rooms.insert(
 			room_id.clone(),
@@ -1556,17 +1575,6 @@ pub(crate) async fn sync_events_v4_route(
 			.map(|(_, pdu)| pdu.to_sync_room_event())
 			.collect();
 
-		let invite_state = if all_invited_rooms.contains(room_id) {
-			services
-				.rooms
-				.state_cache
-				.invite_state(&sender_user, room_id)
-				.unwrap_or(None)
-		} else {
-			None
-		};
-
-		let mut timestamp: Option<_> = None;
 		for (_, pdu) in timeline_pdus {
 			let ts = MilliSecondsSinceUnixEpoch(pdu.origin_server_ts);
 			if DEFAULT_BUMP_TYPES.contains(pdu.event_type()) && !timestamp.is_some_and(|time| time > ts) {