atagen

macltok

public
Star0
Watch0

Commit 8d93a5d23add

tarball

atagen <boss@atagen.co>2026-10-26 05:40 UTC

3 files changed+131-19
deps: take the fork's start-of-room fix

0f2f9829 stops back-pagination calling a room started when its retained events have no gap before them, which on a fresh login left quiet rooms showing Beginning of history with nothing loaded.
Modified file: Cargo.lock+10 additions−10 deletions
@@ -2217,7 +2217,7 @@ dependencies = [
22172217 [[package]]
22182218 name = "matrix-sdk"
22192219 version = "0.18.0"
2220-source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=ec026bc9ea2393fd0cce6212b950d91ab6d36097#ec026bc9ea2393fd0cce6212b950d91ab6d36097"
2220+source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=0f2f982989765b79c39efdc30e86eaafccf69e4a#0f2f982989765b79c39efdc30e86eaafccf69e4a"
22212221 dependencies = [
22222222 "anymap2",
22232223 "aquamarine",
@@ -2280,7 +2280,7 @@ dependencies = [
22802280 [[package]]
22812281 name = "matrix-sdk-base"
22822282 version = "0.18.0"
2283-source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=ec026bc9ea2393fd0cce6212b950d91ab6d36097#ec026bc9ea2393fd0cce6212b950d91ab6d36097"
2283+source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=0f2f982989765b79c39efdc30e86eaafccf69e4a#0f2f982989765b79c39efdc30e86eaafccf69e4a"
22842284 dependencies = [
22852285 "as_variant",
22862286 "assert_matches",
@@ -2310,7 +2310,7 @@ dependencies = [
23102310 [[package]]
23112311 name = "matrix-sdk-common"
23122312 version = "0.18.0"
2313-source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=ec026bc9ea2393fd0cce6212b950d91ab6d36097#ec026bc9ea2393fd0cce6212b950d91ab6d36097"
2313+source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=0f2f982989765b79c39efdc30e86eaafccf69e4a#0f2f982989765b79c39efdc30e86eaafccf69e4a"
23142314 dependencies = [
23152315 "eyeball-im",
23162316 "futures-core",
@@ -2333,7 +2333,7 @@ dependencies = [
23332333 [[package]]
23342334 name = "matrix-sdk-crypto"
23352335 version = "0.18.0"
2336-source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=ec026bc9ea2393fd0cce6212b950d91ab6d36097#ec026bc9ea2393fd0cce6212b950d91ab6d36097"
2336+source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=0f2f982989765b79c39efdc30e86eaafccf69e4a#0f2f982989765b79c39efdc30e86eaafccf69e4a"
23372337 dependencies = [
23382338 "aes",
23392339 "aquamarine",
@@ -2374,7 +2374,7 @@ dependencies = [
23742374 [[package]]
23752375 name = "matrix-sdk-indexeddb"
23762376 version = "0.18.0"
2377-source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=ec026bc9ea2393fd0cce6212b950d91ab6d36097#ec026bc9ea2393fd0cce6212b950d91ab6d36097"
2377+source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=0f2f982989765b79c39efdc30e86eaafccf69e4a#0f2f982989765b79c39efdc30e86eaafccf69e4a"
23782378 dependencies = [
23792379 "async-trait",
23802380 "base64",
@@ -2406,7 +2406,7 @@ dependencies = [
24062406 [[package]]
24072407 name = "matrix-sdk-sqlite"
24082408 version = "0.18.0"
2409-source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=ec026bc9ea2393fd0cce6212b950d91ab6d36097#ec026bc9ea2393fd0cce6212b950d91ab6d36097"
2409+source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=0f2f982989765b79c39efdc30e86eaafccf69e4a#0f2f982989765b79c39efdc30e86eaafccf69e4a"
24102410 dependencies = [
24112411 "as_variant",
24122412 "async-trait",
@@ -2433,7 +2433,7 @@ dependencies = [
24332433 [[package]]
24342434 name = "matrix-sdk-store-encryption"
24352435 version = "0.18.0"
2436-source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=ec026bc9ea2393fd0cce6212b950d91ab6d36097#ec026bc9ea2393fd0cce6212b950d91ab6d36097"
2436+source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=0f2f982989765b79c39efdc30e86eaafccf69e4a#0f2f982989765b79c39efdc30e86eaafccf69e4a"
24372437 dependencies = [
24382438 "base64",
24392439 "blake3",
@@ -2454,7 +2454,7 @@ dependencies = [
24542454 [[package]]
24552455 name = "matrix-sdk-test"
24562456 version = "0.18.0"
2457-source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=ec026bc9ea2393fd0cce6212b950d91ab6d36097#ec026bc9ea2393fd0cce6212b950d91ab6d36097"
2457+source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=0f2f982989765b79c39efdc30e86eaafccf69e4a#0f2f982989765b79c39efdc30e86eaafccf69e4a"
24582458 dependencies = [
24592459 "as_variant",
24602460 "ctor",
@@ -2477,7 +2477,7 @@ dependencies = [
24772477 [[package]]
24782478 name = "matrix-sdk-test-macros"
24792479 version = "0.18.0"
2480-source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=ec026bc9ea2393fd0cce6212b950d91ab6d36097#ec026bc9ea2393fd0cce6212b950d91ab6d36097"
2480+source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=0f2f982989765b79c39efdc30e86eaafccf69e4a#0f2f982989765b79c39efdc30e86eaafccf69e4a"
24812481 dependencies = [
24822482 "quote",
24832483 "syn 2.0.119",
@@ -2486,7 +2486,7 @@ dependencies = [
24862486 [[package]]
24872487 name = "matrix-sdk-ui"
24882488 version = "0.18.0"
2489-source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=ec026bc9ea2393fd0cce6212b950d91ab6d36097#ec026bc9ea2393fd0cce6212b950d91ab6d36097"
2489+source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=0f2f982989765b79c39efdc30e86eaafccf69e4a#0f2f982989765b79c39efdc30e86eaafccf69e4a"
24902490 dependencies = [
24912491 "as_variant",
24922492 "async-rx",
Modified file: Cargo.toml+9 additions−9 deletions
@@ -26,11 +26,11 @@ indexeddb = [
2626 futures-util = { version = "0.3.31", default-features = false, features = ["std"] }
2727 http = "1"
2828 imbl = { version = "6.1.0", default-features = false }
29-matrix-sdk = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "ec026bc9ea2393fd0cce6212b950d91ab6d36097", default-features = false, features = ["e2e-encryption"] }
30-matrix-sdk-base = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "ec026bc9ea2393fd0cce6212b950d91ab6d36097", default-features = false }
31-matrix-sdk-crypto = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "ec026bc9ea2393fd0cce6212b950d91ab6d36097", default-features = false }
32-matrix-sdk-store-encryption = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "ec026bc9ea2393fd0cce6212b950d91ab6d36097", optional = true }
33-matrix-sdk-ui = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "ec026bc9ea2393fd0cce6212b950d91ab6d36097", default-features = false }
29+matrix-sdk = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "0f2f982989765b79c39efdc30e86eaafccf69e4a", default-features = false, features = ["e2e-encryption"] }
30+matrix-sdk-base = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "0f2f982989765b79c39efdc30e86eaafccf69e4a", default-features = false }
31+matrix-sdk-crypto = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "0f2f982989765b79c39efdc30e86eaafccf69e4a", default-features = false }
32+matrix-sdk-store-encryption = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "0f2f982989765b79c39efdc30e86eaafccf69e4a", optional = true }
33+matrix-sdk-ui = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "0f2f982989765b79c39efdc30e86eaafccf69e4a", default-features = false }
3434 ruma = { version = "0.16.0", default-features = false, features = ["unstable-msc2545", "unstable-msc4095"] }
3535 serde = { version = "1.0.219", features = ["derive", "rc"], optional = true }
3636 serde_json = { version = "1.0.143", features = ["raw_value"] }
@@ -54,8 +54,8 @@ js-sys = { version = "0.3.105", optional = true }
5454 # tantivy 0.26's merger reads Instant::now() whenever debug logging is on, and that panics in
5555 # wasm. both caps, since a release_max_level a host sets would otherwise win in release
5656 log = { version = "0.4.29", features = ["max_level_info", "release_max_level_info"] }
57-matrix-sdk = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "ec026bc9ea2393fd0cce6212b950d91ab6d36097", default-features = false, features = ["js"] }
58-matrix-sdk-ui = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "ec026bc9ea2393fd0cce6212b950d91ab6d36097", default-features = false, features = ["js"] }
57+matrix-sdk = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "0f2f982989765b79c39efdc30e86eaafccf69e4a", default-features = false, features = ["js"] }
58+matrix-sdk-ui = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "0f2f982989765b79c39efdc30e86eaafccf69e4a", default-features = false, features = ["js"] }
5959 # the sdk's own wasm reqwest leaves out stream, which the bounded media download needs
6060 reqwest = { version = "0.13.1", default-features = false, features = ["stream"] }
6161 uuid = { version = "1", features = ["js"] }
@@ -70,8 +70,8 @@ web-sys = { version = "0.3.105", optional = true, features = [
7070 ] }
7171
7272 [target.'cfg(not(target_family = "wasm"))'.dev-dependencies]
73-matrix-sdk = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "ec026bc9ea2393fd0cce6212b950d91ab6d36097", default-features = false, features = ["testing"] }
74-matrix-sdk-test = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "ec026bc9ea2393fd0cce6212b950d91ab6d36097" }
73+matrix-sdk = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "0f2f982989765b79c39efdc30e86eaafccf69e4a", default-features = false, features = ["testing"] }
74+matrix-sdk-test = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "0f2f982989765b79c39efdc30e86eaafccf69e4a" }
7575 tokio = { version = "1.47.1", features = ["macros", "rt-multi-thread", "signal", "time"] }
7676 wiremock = "0.6.5"
7777
Modified file: tests/mentions_inbox.rs+112 additions
@@ -1314,3 +1314,115 @@ async fn a_resumed_inbox_with_threaded_replies_still_answers_a_page() {
13141314 sessions.discard().await.unwrap();
13151315 std::fs::remove_dir_all(root).unwrap();
13161316 }
1317+
1318+#[tokio::test]
1319+async fn a_resumed_room_with_only_memberships_still_opens() {
1320+ static NEXT_TEMPORARY_PATH: AtomicUsize = AtomicUsize::new(0);
1321+
1322+ let server = MatrixMockServer::new().await;
1323+ server
1324+ .mock_versions()
1325+ .with_simplified_sliding_sync()
1326+ .ok()
1327+ .mount()
1328+ .await;
1329+ server.mock_login().ok().mount().await;
1330+ server
1331+ .mock_room_messages()
1332+ .ok(matrix_sdk::test_utils::mocks::RoomMessagesResponseTemplate::default())
1333+ .mount()
1334+ .await;
1335+ let root = std::env::temp_dir().join(format!(
1336+ "macltok-membership-room-{}-{}",
1337+ std::process::id(),
1338+ NEXT_TEMPORARY_PATH.fetch_add(1, Ordering::Relaxed)
1339+ ));
1340+ let sessions = Arc::new(EncryptedSessionStore::file(
1341+ root.join("records").join("session"),
1342+ StoreConfig::sqlite(root.join("store"), "membership room test passphrase"),
1343+ ));
1344+ let room_id = room_id!("!memberships-resume:matrix.org");
1345+ let own_user = user_id!("@cheeky_monkey:matrix.org");
1346+ let member = |event_id: &str, user: &str, ts: u64| {
1347+ json!({
1348+ "type": "m.room.member",
1349+ "event_id": event_id,
1350+ "sender": user,
1351+ "state_key": user,
1352+ "origin_server_ts": ts,
1353+ "content": { "membership": "join" },
1354+ })
1355+ };
1356+ let feed = SlidingFeed::new(
1357+ room_id.to_owned(),
1358+ vec![
1359+ json!({
1360+ "type": "m.room.create",
1361+ "event_id": "$created",
1362+ "sender": own_user,
1363+ "state_key": "",
1364+ "origin_server_ts": 1,
1365+ "content": { "room_version": "11" },
1366+ }),
1367+ member("$own-joined", own_user.as_str(), 2),
1368+ member("$alice-joined", "@alice:matrix.org", 3),
1369+ ],
1370+ );
1371+ feed.set_required_state(room_id, vec![member("$own-joined", own_user.as_str(), 2)]);
1372+ feed.mount(&server).await;
1373+
1374+ let config = EngineConfig::default()
1375+ .with_initial_history_limit(0)
1376+ .with_search_backfill_pages_per_room(0);
1377+ let session = Session::login_password(
1378+ PasswordLogin::new(server.uri(), "example", "wordpass").allow_insecure_loopback(true),
1379+ sessions.clone(),
1380+ )
1381+ .await
1382+ .unwrap();
1383+ let (engine, handle, mut events) = session.build(config.clone()).await.unwrap();
1384+ let running = tokio::spawn(engine.run());
1385+ tokio::time::timeout(Duration::from_secs(10), async {
1386+ while !handle
1387+ .rooms()
1388+ .await
1389+ .iter()
1390+ .any(|room| room.room_id == room_id)
1391+ {
1392+ tokio::time::sleep(Duration::from_millis(20)).await;
1393+ }
1394+ })
1395+ .await
1396+ .expect("the room never synced");
1397+ tokio::time::timeout(
1398+ Duration::from_secs(10),
1399+ handle.open_room(room_id.to_owned()),
1400+ )
1401+ .await
1402+ .expect("opening the room never answered before the restart")
1403+ .unwrap();
1404+ shut_down(&handle, &mut events, running).await;
1405+ drop(handle);
1406+
1407+ let Some(Restore::Resumed(session)) = Session::restore(sessions.clone()).await.unwrap() else {
1408+ panic!("the saved session did not resume");
1409+ };
1410+ let (engine, handle, mut events) = session.build(config).await.unwrap();
1411+ let running = tokio::spawn(engine.run());
1412+ receive_until(&mut events, |event| {
1413+ matches!(event, Event::Authenticated { .. })
1414+ })
1415+ .await;
1416+ tokio::time::timeout(
1417+ Duration::from_secs(10),
1418+ handle.open_room(room_id.to_owned()),
1419+ )
1420+ .await
1421+ .expect("opening the resumed room never answered")
1422+ .unwrap();
1423+ shut_down(&handle, &mut events, running).await;
1424+ drop(handle);
1425+
1426+ sessions.discard().await.unwrap();
1427+ std::fs::remove_dir_all(root).unwrap();
1428+}