diff --git a/Cargo.lock b/Cargo.lock index ca8d3368..ab69a19e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -173,9 +173,9 @@ checksum = "9dbc3a507a82b17ba0d98f6ce8fd6954ea0c8152e98009d36a40d8dcc8ce078a" [[package]] name = "askama" -version = "0.15.4" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08e1676b346cadfec169374f949d7490fd80a24193d37d2afce0c047cf695e57" +checksum = "bb7125972258312e79827b60c9eb93938334100245081cf701a2dee981b17427" dependencies = [ "askama_macros", "itoa", @@ -186,9 +186,9 @@ dependencies = [ [[package]] name = "askama_derive" -version = "0.15.4" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7661ff56517787343f376f75db037426facd7c8d3049cef8911f1e75016f3a37" +checksum = "8ba5e7259a1580c61571e3116ebaaa01e3c001b2132b17c4cc5c70780ca3e994" dependencies = [ "askama_parser", "basic-toml", @@ -203,18 +203,18 @@ dependencies = [ [[package]] name = "askama_macros" -version = "0.15.4" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713ee4dbfd1eb719c2dab859465b01fa1d21cb566684614a713a6b7a99a4e47b" +checksum = "236ce20b77cb13506eaf5024899f4af6e12e8825f390bd943c4c37fd8f322e46" dependencies = [ "askama_derive", ] [[package]] name = "askama_parser" -version = "0.15.4" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d62d674238a526418b30c0def480d5beadb9d8964e7f38d635b03bf639c704c" +checksum = "f3c63392767bb2df6aa65a6e1e3b80fd89bb7af6d58359b924c0695620f1512e" dependencies = [ "rustc-hash", "serde", @@ -235,7 +235,7 @@ dependencies = [ "nom 7.1.3", "num-traits", "rusticata-macros", - "thiserror 2.0.18", + "thiserror 2.0.17", "time", ] @@ -338,7 +338,7 @@ dependencies = [ "num-traits", "pastey", "rayon", - "thiserror 2.0.18", + "thiserror 2.0.17", "v_frame", "y4m", ] @@ -685,9 +685,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.11.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] name = "bytesize" @@ -735,7 +735,7 @@ dependencies = [ "semver", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.17", ] [[package]] @@ -745,7 +745,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" dependencies = [ "serde", - "toml 0.9.12+spec-1.1.0", + "toml 0.9.11+spec-1.1.0", ] [[package]] @@ -792,9 +792,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.43" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ "num-traits", ] @@ -812,9 +812,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.59" +version = "4.5.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5caf74d17c3aec5495110c34cc3f78644bfa89af6c8993ed4de2790e49b6499" +checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" dependencies = [ "clap_builder", "clap_derive", @@ -822,9 +822,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.59" +version = "4.5.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "370daa45065b80218950227371916a1633217ae42b2715b2287b606dcd618e24" +checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" dependencies = [ "anstyle", "clap_lex", @@ -832,9 +832,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.55" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ "heck", "proc-macro2", @@ -844,9 +844,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "1.0.0" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" +checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" [[package]] name = "cmake" @@ -1032,13 +1032,13 @@ dependencies = [ "serde_regex", "smallstr", "smallvec", - "thiserror 2.0.18", + "thiserror 2.0.17", "tikv-jemalloc-ctl", "tikv-jemalloc-sys", "tikv-jemallocator", "tokio", "tokio-metrics", - "toml 0.9.12+spec-1.1.0", + "toml 0.9.11+spec-1.1.0", "tracing", "tracing-core", "tracing-subscriber", @@ -1159,7 +1159,7 @@ dependencies = [ "conduwuit_service", "futures", "rand 0.8.5", - "thiserror 2.0.18", + "thiserror 2.0.17", "tracing", ] @@ -1912,9 +1912,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1927,9 +1927,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1937,15 +1937,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1954,15 +1954,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", @@ -1971,21 +1971,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -1995,6 +1995,7 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", + "pin-utils", "slab", ] @@ -2201,7 +2202,7 @@ dependencies = [ "rand 0.9.2", "ring", "serde", - "thiserror 2.0.18", + "thiserror 2.0.17", "tinyvec", "tokio", "tracing", @@ -2225,7 +2226,7 @@ dependencies = [ "resolv-conf", "serde", "smallvec", - "thiserror 2.0.18", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -2751,7 +2752,7 @@ dependencies = [ "percent-encoding", "rustls", "rustls-native-certs", - "thiserror 2.0.18", + "thiserror 2.0.17", "tokio", "tokio-rustls", "tokio-stream", @@ -2768,9 +2769,9 @@ checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" [[package]] name = "libc" -version = "0.2.182" +version = "0.2.180" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" +checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" [[package]] name = "libfuzzer-sys" @@ -3418,7 +3419,7 @@ dependencies = [ "futures-sink", "js-sys", "pin-project-lite", - "thiserror 2.0.18", + "thiserror 2.0.17", "tracing", ] @@ -3448,7 +3449,7 @@ dependencies = [ "opentelemetry_sdk", "prost", "reqwest", - "thiserror 2.0.18", + "thiserror 2.0.17", "tokio", "tonic", "tracing", @@ -3479,7 +3480,7 @@ dependencies = [ "opentelemetry", "percent-encoding", "rand 0.9.2", - "thiserror 2.0.18", + "thiserror 2.0.17", "tokio", "tokio-stream", ] @@ -3739,9 +3740,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.106" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" dependencies = [ "unicode-ident", ] @@ -3867,7 +3868,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2 0.6.1", - "thiserror 2.0.18", + "thiserror 2.0.17", "tokio", "tracing", "web-time", @@ -3888,7 +3889,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.18", + "thiserror 2.0.17", "tinyvec", "tracing", "web-time", @@ -3910,9 +3911,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.44" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" dependencies = [ "proc-macro2", ] @@ -4012,7 +4013,7 @@ dependencies = [ "rand 0.9.2", "rand_chacha 0.9.0", "simd_helpers", - "thiserror 2.0.18", + "thiserror 2.0.17", "v_frame", "wasm-bindgen", ] @@ -4074,9 +4075,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.12.3" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", @@ -4226,7 +4227,7 @@ dependencies = [ "serde", "serde_html_form", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.17", "url", "web-time", ] @@ -4254,7 +4255,7 @@ dependencies = [ "serde_html_form", "serde_json", "smallvec", - "thiserror 2.0.18", + "thiserror 2.0.17", "time", "tracing", "url", @@ -4281,7 +4282,7 @@ dependencies = [ "serde", "serde_json", "smallvec", - "thiserror 2.0.18", + "thiserror 2.0.17", "tracing", "url", "web-time", @@ -4306,7 +4307,7 @@ dependencies = [ "ruma-events", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.17", "tracing", ] @@ -4316,7 +4317,7 @@ version = "0.9.5" source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=3126cb5eea991ec40590e54d8c9d75637650641a#3126cb5eea991ec40590e54d8c9d75637650641a" dependencies = [ "js_int", - "thiserror 2.0.18", + "thiserror 2.0.17", ] [[package]] @@ -4369,7 +4370,7 @@ dependencies = [ "serde_json", "sha2", "subslice", - "thiserror 2.0.18", + "thiserror 2.0.17", ] [[package]] @@ -4516,7 +4517,7 @@ dependencies = [ "futures-util", "pin-project", "thingbuf", - "thiserror 2.0.18", + "thiserror 2.0.17", "unicode-segmentation", "unicode-width 0.2.2", ] @@ -4544,7 +4545,7 @@ checksum = "d55ae5ea09894b6d5382621db78f586df37ef18ab581bf32c754e75076b124b1" dependencies = [ "arraydeque", "smallvec", - "thiserror 2.0.18", + "thiserror 2.0.17", ] [[package]] @@ -4732,7 +4733,7 @@ dependencies = [ "rand 0.9.2", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.17", "time", "url", "uuid", @@ -5074,9 +5075,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.116" +version = "2.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df424c70518695237746f84cede799c9c58fcb37450d7b23716568cc8bc69cb" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" dependencies = [ "proc-macro2", "quote", @@ -5132,7 +5133,7 @@ dependencies = [ "lazy-regex", "minimad", "serde", - "thiserror 2.0.18", + "thiserror 2.0.17", "unicode-width 0.1.14", ] @@ -5157,11 +5158,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.18" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.18", + "thiserror-impl 2.0.17", ] [[package]] @@ -5177,9 +5178,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.18" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", @@ -5323,9 +5324,9 @@ dependencies = [ [[package]] name = "tokio-metrics" -version = "0.4.8" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12c48227f311eaa0b0ae5860089860509d7249e0e5da8f7a5d17f4808a1ad387" +checksum = "a34e87dd30650518a4e041bca77c931f3f5a19621eecdcd794f5c1813bca9e98" dependencies = [ "futures-util", "pin-project-lite", @@ -5381,9 +5382,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.12+spec-1.1.0" +version = "0.9.11+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +checksum = "f3afc9a848309fe1aaffaed6e1546a7a14de1f935dc9d89d32afd9a44bab7c46" dependencies = [ "indexmap", "serde_core", @@ -5440,9 +5441,9 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.8+spec-1.1.0" +version = "1.0.6+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0742ff5ff03ea7e67c8ae6c93cac239e0d9784833362da3f9a9c1da8dfefcbdc" +checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" dependencies = [ "winnow", ] @@ -6263,7 +6264,7 @@ dependencies = [ "nom 7.1.3", "oid-registry", "rusticata-macros", - "thiserror 2.0.18", + "thiserror 2.0.17", "time", ] diff --git a/src/core/matrix/state_res/mod.rs b/src/core/matrix/state_res/mod.rs index ded63800..597df3da 100644 --- a/src/core/matrix/state_res/mod.rs +++ b/src/core/matrix/state_res/mod.rs @@ -18,27 +18,28 @@ use std::{ use futures::{Future, FutureExt, Stream, StreamExt, TryFutureExt, TryStreamExt}; use itertools::Itertools; use ruma::{ - EventId, Int, MilliSecondsSinceUnixEpoch, OwnedEventId, RoomVersionId, events::{ - StateEventType, TimelineEventType, - room::member::{MembershipState, RoomMemberEventContent}, - }, - int, + room::member::{MembershipState, RoomMemberEventContent}, StateEventType, + TimelineEventType, + }, int, EventId, Int, MilliSecondsSinceUnixEpoch, + OwnedEventId, + RoomVersionId, }; use serde_json::from_str as from_json_str; pub(crate) use self::error::Error; use self::power_levels::PowerLevelsContentFields; pub use self::{event_auth::iterative_auth_checks::auth_check, room_version::RoomVersion}; +use crate::utils::TryFutureExtExt; use crate::{ - Pdu, debug, err, error as log_error, - matrix::{Event, StateKey}, + debug, err, error as log_error, matrix::{Event, StateKey}, state_res::{ event_auth::auth_events::auth_types_for_event, room_version::StateResolutionVersion, }, trace, utils::stream::{BroadbandExt, IterStream, ReadyExt, TryBroadbandExt, WidebandExt}, warn, + Pdu, }; /// A mapping of event type and state_key to some value `T`, usually an @@ -72,7 +73,7 @@ type Result = crate::Result; /// event is part of the same room. //#[tracing::instrument(level = "debug", skip(state_sets, auth_chain_sets, //#[tracing::instrument(level event_fetch))] -pub async fn resolve<'a, Sets, SetIter, Hasher, FE, Exists>( +pub async fn resolve<'a, Sets, SetIter, Hasher, FE, FR, Exists>( room_version: &RoomVersionId, state_sets: Sets, auth_chain_sets: &'a [HashSet], @@ -80,7 +81,8 @@ pub async fn resolve<'a, Sets, SetIter, Hasher, FE, Exists>( event_exists: &Exists, ) -> Result> where - FE: AsyncFn(OwnedEventId) -> Result> + Sync, + FE: Fn(&EventId) -> FR + Sync, + FR: Future, Error>> + Send, Exists: AsyncFn(OwnedEventId) -> bool + Sync, Sets: IntoIterator + Send, SetIter: Iterator> + Clone + Send, @@ -360,13 +362,14 @@ where /// The power level is negative because a higher power level is equated to an /// earlier (further back in time) origin server timestamp. #[tracing::instrument(level = "debug", skip_all)] -async fn reverse_topological_power_sort( +async fn reverse_topological_power_sort( events_to_sort: Vec, auth_diff: &HashSet, fetch_event: &FE, ) -> Result> where - FE: AsyncFn(OwnedEventId) -> Result> + Sync, + FE: Fn(&EventId) -> FR + Sync, + FR: Future, Error>> + Send, { debug!("reverse topological sort of power events"); @@ -403,7 +406,7 @@ where .get(&event_id) .ok_or_else(|| Error::NotFound(String::new()))?; - let ev = fetch_event(event_id) + let ev = fetch_event(&event_id) .await? .ok_or_else(|| Error::NotFound(String::new()))?; @@ -543,13 +546,14 @@ where /// Do NOT use this any where but topological sort, we find the power level for /// the eventId at the eventId's generation (we walk backwards to `EventId`s /// most recent previous power level event). -async fn get_power_level_for_sender(event_id: &EventId, fetch_event: &FE) -> Result +async fn get_power_level_for_sender(event_id: &EventId, fetch_event: &FE) -> Result where - FE: AsyncFn(OwnedEventId) -> Result> + Sync, + FE: Fn(&EventId) -> FR + Sync, + FR: Future, Error>> + Send, { debug!("fetch event ({event_id}) senders power level"); - let event = fetch_event(event_id.to_owned()).await?; + let event = fetch_event(event_id).await?; let auth_events = event.as_ref().map(Event::auth_events); @@ -557,7 +561,7 @@ where .into_iter() .flatten() .stream() - .broadn_filter_map(5, |aid| fetch_event(aid.to_owned())) + .broad_filter_map(|aid| fetch_event(aid).unwrap_or_default()) .ready_find(|aev| is_type_and_key(aev, &TimelineEventType::RoomPowerLevels, "")) .await; @@ -588,14 +592,15 @@ where /// the the `fetch_event` closure and verify each event using the /// `event_auth::auth_check` function. #[tracing::instrument(level = "trace", skip_all)] -async fn iterative_auth_check( +async fn iterative_auth_check( room_version: &RoomVersion, events_to_check: S, unconflicted_state: StateMap, fetch_event: &FE, ) -> Result> where - FE: AsyncFn(&EventId) -> Result, Error> + Sync + Send, + FE: Fn(&EventId) -> FR, + FR: Future, Error>> + Send + Sync, S: Stream + Send, { debug!("starting iterative auth check"); @@ -757,13 +762,14 @@ where /// after the most recent are depth 0, the events before (with the first power /// level as a parent) will be marked as depth 1. depth 1 is "older" than depth /// 0. -async fn mainline_sort( +async fn mainline_sort( to_sort: &[OwnedEventId], resolved_power_level: Option, fetch_event: &FE, ) -> Result> where - FE: AsyncFn(OwnedEventId) -> Result> + Sync, + FE: Fn(&EventId) -> FR + Sync, + FR: Future, Error>> + Send, { debug!("mainline sort of events"); @@ -777,13 +783,13 @@ where while let Some(p) = pl { mainline.push(p.clone()); - let event = fetch_event(p.clone()) + let event = fetch_event(&p) .await? .ok_or_else(|| Error::NotFound(format!("Failed to find {p}")))?; pl = None; for aid in event.auth_events() { - let ev = fetch_event(aid.to_owned()) + let ev = fetch_event(aid) .await? .ok_or_else(|| Error::NotFound(format!("Failed to find {aid}")))?; @@ -805,7 +811,7 @@ where .iter() .stream() .broad_filter_map(async |ev_id| { - fetch_event(ev_id.clone()) + fetch_event(ev_id) .await .ok() .flatten() @@ -831,13 +837,14 @@ where /// Get the mainline depth from the `mainline_map` or finds a power_level event /// that has an associated mainline depth. -async fn get_mainline_depth( +async fn get_mainline_depth( mut event: Option, mainline_map: &HashMap, fetch_event: &FE, ) -> Result where - FE: AsyncFn(OwnedEventId) -> Result> + Sync, + FE: Fn(&EventId) -> FR + Sync, + FR: Future, Error>> + Send, { while let Some(sort_ev) = event { debug!(event_id = sort_ev.event_id().as_str(), "mainline"); @@ -849,7 +856,7 @@ where event = None; for aid in sort_ev.auth_events() { - let aev = fetch_event(aid.to_owned()) + let aev = fetch_event(aid) .await? .ok_or_else(|| Error::NotFound(format!("Failed to find {aid}")))?; @@ -863,18 +870,19 @@ where Ok(0) } -async fn add_event_and_auth_chain_to_graph( +async fn add_event_and_auth_chain_to_graph( graph: &mut HashMap>, event_id: OwnedEventId, auth_diff: &HashSet, fetch_event: &FE, ) where - FE: AsyncFn(OwnedEventId) -> Result> + Sync, + FE: Fn(&EventId) -> FR + Sync, + FR: Future, Error>> + Send, { let mut state = vec![event_id]; while let Some(eid) = state.pop() { graph.entry(eid.clone()).or_default(); - let event = fetch_event(eid.clone()).await.ok().flatten(); + let event = fetch_event(&eid).await.ok().flatten(); let auth_events = event.as_ref().map(Event::auth_events).into_iter().flatten(); // Prefer the store to event as the store filters dedups the events @@ -893,11 +901,12 @@ async fn add_event_and_auth_chain_to_graph( } } -async fn is_power_event_id(event_id: &EventId, fetch: &FE) -> bool +async fn is_power_event_id(event_id: &EventId, fetch: &FE) -> bool where - FE: AsyncFn(OwnedEventId) -> Result> + Sync, + FE: Fn(&EventId) -> FR + Sync, + FR: Future, Error>> + Send, { - match fetch(event_id.to_owned()).await.as_ref() { + match fetch(event_id).await.as_ref() { | Ok(Some(state)) => is_power_event(state), | _ => false, } @@ -959,23 +968,23 @@ mod tests { use maplit::{hashmap, hashset}; use rand::seq::SliceRandom; use ruma::{ - MilliSecondsSinceUnixEpoch, OwnedEventId, RoomVersionId, events::{ - StateEventType, TimelineEventType, - room::join_rules::{JoinRule, RoomJoinRulesEventContent}, - }, - int, uint, + room::join_rules::{JoinRule, RoomJoinRulesEventContent}, StateEventType, + TimelineEventType, + }, int, uint, + MilliSecondsSinceUnixEpoch, + OwnedEventId, RoomVersionId, }; use serde_json::{json, value::to_raw_value as to_raw_json_value}; use super::{ - StateMap, is_power_event, - room_version::RoomVersion, + is_power_event, room_version::RoomVersion, test_utils::{ - INITIAL_EVENTS, TestStore, alice, bob, charlie, do_check, ella, event_id, - member_content_ban, member_content_join, room_id, to_init_pdu_event, to_pdu_event, - zara, + alice, bob, charlie, do_check, ella, event_id, member_content_ban, member_content_join, + room_id, to_init_pdu_event, to_pdu_event, zara, TestStore, + INITIAL_EVENTS, }, + StateMap, }; use crate::{ debug, @@ -1005,7 +1014,7 @@ mod tests { .map(|pdu| pdu.event_id.clone()) .collect::>(); - let fetcher = |id| ready(events.get(&id).cloned()); + let fetcher = |id| ready(Ok(events.get(id).cloned())); let sorted_power_events = super::reverse_topological_power_sort(power_events, &auth_chain, &fetcher) .await