Commit Graph

14300 Commits

Author SHA1 Message Date
Ivan Enderlin
d545419684 test(common): Add lazy_loader::from_all_chunks.
This patch adds the new `from_all_chunks` function in the
`linked_chunk::lazy_loader` module. It is only used for testing
purposes. It aims at replacing `LinkedChunkBuilderTest` (see next
patches). Why? Because `from_all_chunks` uses `from_last_chunk` and
`insert_new_first_chunk`: if `from_all_chunks` is able to find all
errors that `LinkedChunkBuilderTest` finds, it's a bingo. Transitively,
it proves that `from_last_chunk` and `insert_new_first_chunk` are
correct!
2025-02-21 12:06:08 +01:00
Jonas Platte
f900db49dd feat(sdk): Re-export the base crate's store module
Fixes a broken intra-doc link.
2025-02-21 09:36:50 +01:00
Jonas Platte
1373f99288 refactor: Use NonZeroUsize::new + unwrap in const contexts
Make clippy happy.
2025-02-21 09:36:50 +01:00
Jonas Platte
f56bc4c0d6 chore: Bump nightly 2025-02-21 09:36:50 +01:00
Benjamin Bouvier
60efcbc55d refactor(event cache): use Option<&mut> in Chunk::insert_before 2025-02-20 16:28:22 +01:00
Benjamin Bouvier
30589ca899 refactor(event cache): use Option<&mut> in Chunk::unlink 2025-02-20 16:28:22 +01:00
Damir Jelić
61fa339163 refactor(crypto): Add a constructor to create an InboundGroupSession from a m.room_key event 2025-02-20 12:28:45 +01:00
Damir Jelić
3f5efc1ff6 docs(crypto): Update some docs for the InboundGroupSession 2025-02-20 12:28:45 +01:00
Ivan Enderlin
23f72ba15f test(common): Test ability for AsVector to generate several VectorDiff::Remove.
This patch adds a test ensuring that `AsVector` generates the correct
`VectorDiff::Remove` when a non-empty chunk is removed.
2025-02-20 10:52:59 +01:00
Ivan Enderlin
a25acf7e62 feat(common): Update::RemoveChunk emits VectorDiff::Remove.
This patch updates `Update::RemoveChunk` to emit `VectorDiff::Remove`.
Until now, `RemoveChunk` was expecting the chunk to be
empty, because it is how it is used so far. However, with
https://github.com/matrix-org/matrix-rust-sdk/pull/4694, it can change
rapidly.
2025-02-20 10:52:59 +01:00
Benjamin Bouvier
c3fc310f29 refactor(event cache): simplify back-pagination 2025-02-20 10:51:06 +01:00
Benjamin Bouvier
b9c7ffe7c3 doc(timeline): tweak comment in pagination to explain why it's correct 2025-02-20 10:51:06 +01:00
Benjamin Bouvier
017a947fc1 doc(timeline): fix a broken link to all_remote_events 2025-02-20 10:01:57 +01:00
Benjamin Bouvier
5c57631a6c refactor(event cache): simplify flow when deciding to resolve a gap
The code before this patch was doing this:

- look if there's any prev-batch token available right now, aka look if
there's a gap in the in-memory linked chunk
- look at the first chunk; if it's a gap, return to the caller so it
resolves it

The check is done twice at two different levels, which is confusing.
Instead, this patch rewrites it so that the chunk is done only in
`load_more_event_backwards()`.

Note this is also correct for the case storage is disabled; in this
case, we early return and always try to resolve the gap anyways.
2025-02-19 15:39:58 +01:00
Ivan Enderlin
3495cab7ad refactor(common): builder::LinkedChunkBuilder::* becomes lazy_loader::*.
This patch renames the `builder` module to `lazy_loader`.
The `LinkedChunkBuilder`'s methods are now functions.
The `LinkedChunkBuilder` struct is removed. Finally,
`LinkedChunkBuilderError` is renamed `LazyLoaderError`.

The `LinkedChunkBuilderTest` struct is kept for the moment. It's going
to be replaced soon.
2025-02-19 14:38:56 +01:00
bitfriend
7a06bdb695 Rename snapshots to reduce filename length (#4625) 2025-02-19 13:29:51 +00:00
Ivan Enderlin
6c57003d17 feat(sqlite) Add an index on events.event_id and .room_id.
This patch adds an index on `events.event_id` and on `events.room_id`
so that queries on this column are faster. It mostly happens for the
`Deduplicator`, which runs for every backwards pagination or sync.

This patch also updates the query in `filter_duplicated_events` to
sort event by their `chunk_id` and `position` so that the results are
constant, it helps when testing.
2025-02-19 11:50:23 +01:00
Kévin Commaille
2eb2ae7959 refactor(oidc): Use the GET /auth_metadata Matrix endpoint (#4673)
This is the method to get the server metadata in the latest draft of
[MSC2965](https://github.com/matrix-org/matrix-spec-proposals/pull/2965).

We still keep the old behavior with `GET /auth_issuer` as fallback for
now because it has wider server support.

There are some pre-main commit cleanups to simplify the main commit.
This can be reviewed commit by commit.

The changes were tested with the oidc_cli example on beta.matrix.org.

Closes #4550.

---------

Signed-off-by: Kévin Commaille <zecakeh@tedomum.fr>
2025-02-18 17:41:48 +01:00
Ivan Enderlin
a055aa3e57 chore(sdk): Fix comments and rename variables. 2025-02-18 17:13:12 +01:00
Ivan Enderlin
5c7a733f49 task(common): LinkedChunkBuilder detects cycles. 2025-02-18 17:13:12 +01:00
Ivan Enderlin
00ae386b74 test(sdk): Test RoomEvents::debug_string.
This patch moves `chunk_debug_string` from `rooms/mod.rs` to
`rooms/event.rs`. In addition, it restores (and rewrites) a test,
initially for `chunk_debug_string`, now for `RoomEvents::debug_string`
whichh is the public API.
2025-02-18 17:13:12 +01:00
Ivan Enderlin
9ad7ca8f11 test(sdk): Write a full integration test for the event cache lazy-loading. 2025-02-18 17:13:12 +01:00
Ivan Enderlin
a43ce05200 task(sdk): LinkedChunkBuider::load_previous_chunk supports lazy_previous.
This patch installs `lazy_previous` in the `LinkedChunkBuilder`.
2025-02-18 17:13:12 +01:00
Ivan Enderlin
7d4dfb5c2d fix(sdk): Change semantics about duplicated events for a backwards pagination.
This patch changes the semantics regarding what to do in case of
duplicated events received during a backwards pagination.

Previously, the strategy for both sync and backwards pagination was
the same: With the new received events, when duplicated events are
detected, the old events are removed and the new ones are kept.

The strategy is reversed for backwards pagination: the old events are
always kept, and the duplicated events are removed from the new events.

The rest of the patch is about removing dead code because of this
change.
2025-02-18 17:13:12 +01:00
Ivan Enderlin
d9e9006e61 feat(sdk): event_cache::Pagination::run_backwards paginates in the event cache.
This patch updates `Pagination::run_backwards_impl` to paginate in the
event cache. The flow is now as follow:

- backwards pagination tries to load and to insert a new previous chunk
   from the store
  - if the new chunk contains events, they are returned, pagination done
  - if the new chunk is a gap, the flow continues
- (as previously) check for a prev batch token (it exists in the newly
  inserted gap)
- (as previously) run a network request, replace the gap by the new
  events
- etc.

The new part is to load and to insert a new previous chunk. The rest
is stays the same. The code has been moved in code to keep the lock
releases happy and to clarify the code.
2025-02-18 17:13:12 +01:00
Ivan Enderlin
bfec34db20 task(sdk) Add RoomEventCacheState::load_more_events_backwards.
This patch adds the `RoomEventCacheState::load_more_events_backwards`
method to load a new chunk and to insert it at the beginning of the
`LinkedChunk`.

It uses the new `EventCacheStore::load_previous_chunk` method, along
with the new `LinkedChunkBuilder::insert_new_first_chunk` method.
2025-02-18 17:13:12 +01:00
Ivan Enderlin
0aae72c161 feat(sdk): The EventCache loads only the last chunk when initialised.
This patch updates `RoomEventCacheState::new` to load a single chunks
of events instead of all events. It solves bugs where all events were
loaded, while removing the gaps in between, thus the `Timeline` wasn't
able to load the missing events to fill the gaps.
2025-02-18 17:13:12 +01:00
Ivan Enderlin
fbd8b9c816 chore(sdk): Remove useless indentations. 2025-02-18 17:13:12 +01:00
Ivan Enderlin
d6120a5985 doc(sdk): Events from BackPaginationOutcome are deduplicated…
This patch removes a `TODO` in `BackPaginationOutcome`.
Events it contains are deduplicated by the `EventCache` (see
`event_cache::Deduplicator`) when inserted inside `RoomEventCache`.
2025-02-18 17:13:12 +01:00
Ivan Enderlin
a8f7939126 doc(ui): Fix a typo. 2025-02-18 17:13:12 +01:00
Ivan Enderlin
217429c3fe test(common): Add tests for LinkedChunkBuilder::insert_new_first_chunk.
This patch adds tests for the
`LinkedChunkBuilder::insert_new_first_chunk` method.
2025-02-18 17:13:12 +01:00
Ivan Enderlin
716958bb86 test(common): Add tests for LinkedChunkBuilder::from_last_chunk.
This patch adds tests for the `LinkedChunkBuilder::from_last_chunk`
method.
2025-02-18 17:13:12 +01:00
Ivan Enderlin
1319558eb6 test(base): Add test_linked_chunk_incremental_loading.
This patch adds a test for all event cache store
implementations that tests a linked chunk incremental
loading, i.e. the `EventCacheStore::load_last_chunk` and
`EventCacheStore::load_previous_chunk` methods.
2025-02-18 17:13:12 +01:00
Ivan Enderlin
096d478593 chore(base): Split LinkedChunkBuilder and create LinkedChunkBuilderTest.
Most of the methods on `LinkedChunkBuilder` are now only used
for testing. This patch splits `LinkedChunkBuilder` and creates
`LinkedChunkBuilderTest`. This new type is part of the public
API because it's used in other crates, but it's hidden from the
documentation.
2025-02-18 17:13:12 +01:00
Ivan Enderlin
8fcd5a91c4 test(sdk): Update tests.
This patch updates 3 tests that were expected to read all events: a
pagination is now necessary.
2025-02-18 17:13:12 +01:00
Ivan Enderlin
155042e46c task(common): LinkedChunkBuilder gains from_last_chunk and insert_new_first_chunk.
This patch adds two methods on `LinkedChunkBuilder`: `from_last_chunk`
to build a new `LinkedChunk` with a single provided chunk, and
`insert_new_first_chunk` to insert a new chunk at the beginning of the
provided `LinkedChunk`.
2025-02-18 17:13:12 +01:00
Ivan Enderlin
e03d40e946 chore(sdk): Rename RoomEvents::with_initial_chunks.
This patch renames `RoomEvents::with_initial_chunks` to
`with_initial_linked_chunk`. It avoids a confusion between several
chunks, like `RawChunk`s, and `LinkedChunk` which represents several
`Chunk`s.
2025-02-18 17:13:12 +01:00
Benjamin Bouvier
2671769d9f fix(compilation): fix benchmark compilation on non-linux platforms 2025-02-18 13:58:23 +01:00
Jorge Martín
8d9d83f15f feat(ffi): add history_visibility_override param to the create room fn 2025-02-18 13:08:02 +01:00
Ivan Enderlin
6bc9dc5c6a test(sdk): Improve a test.
This patch adds an event to be sure it is removed later during the error
recovery.
2025-02-18 11:38:24 +01:00
Ivan Enderlin
d6566484a1 doc(sqlite): Fix typos in comments. 2025-02-18 11:38:24 +01:00
Ivan Enderlin
0e4d8ec62f feat(sqlite): Detect cycles when loading last chunk of LinkedChunk.
This patch updates `SqliteEventCacheStore::load_last_chunk` to detect
cycle for the last chunk only.
2025-02-18 11:38:24 +01:00
Ivan Enderlin
f9c6f897c8 feat(common): Detect cycles when loading last chunk of LinkedChunk.
This patch updates `RelationalLinkedChunk::load_last_chunk` to detect
cycle for the last chunk only.
2025-02-18 11:38:24 +01:00
Ivan Enderlin
7252a685a6 test(common): Test RelationalLinkedChunk::load_last_chunk and load_previous_chunk.
This patch adds tests for the `load_last_chunk` and
`load_previous_chunk` methods on `RelationalLinkedChunk`.
2025-02-18 11:38:24 +01:00
Ivan Enderlin
bed4d5034e test(sqlite): Test SqliteEventCacheStore::load_last_chunk and load_previous_chunk.
This patch adds tests for the `SqliteEventCacheStore::load_last_chunk`
and `load_previous_chunk` methods.
2025-02-18 11:38:24 +01:00
Ivan Enderlin
e2a2f32e82 task(sqlite): Implement load_last_chunk and last_previous_chunk.
This patch replaces `todo!()` by real implementations for the
`load_last_chunk` and `last_previous_chunk` methods.
2025-02-18 11:38:24 +01:00
Ivan Enderlin
334c66b0a0 task(base): Update EventCacheStore to add load_last_chunk and load_previous_chunk.
This patch update the `EventCacheStore` trait to:

1. rename `reload_linked_chunk` into `load_all_chunks` and put this
   method behind `#[cfg(test)]` so that it is removed from the public API,
2. add `load_last_chunk`,
3. add `load_previous_chunk`.

These 2 new methods are implemented inside the `MemoryStore` (with its
real implementation in the `RelationalLinkedChunk`), but `todo!()` are
added for the SQLite implementation.
2025-02-18 11:38:24 +01:00
Kévin Commaille
ca392b08c9 chore: Add changelog for UserSession deserialization
Signed-off-by: Kévin Commaille <zecakeh@tedomum.fr>
2025-02-18 11:32:44 +01:00
Kévin Commaille
e9a34f6359 refactor(oidc): Remove support for deserializing previous UserSession format
The format changed 10 months ago and since it contains the tokens, it should have be reserialized already in that time.

Afaict EX clients do not serialize that type, the bindings have their own `Session` type for that.

Signed-off-by: Kévin Commaille <zecakeh@tedomum.fr>
2025-02-18 11:32:44 +01:00
dependabot[bot]
6411d27096 chore(deps): bump crate-ci/typos from 1.29.5 to 1.29.7
Bumps [crate-ci/typos](https://github.com/crate-ci/typos) from 1.29.5 to 1.29.7.
- [Release notes](https://github.com/crate-ci/typos/releases)
- [Changelog](https://github.com/crate-ci/typos/blob/master/CHANGELOG.md)
- [Commits](https://github.com/crate-ci/typos/compare/v1.29.5...v1.29.7)

---
updated-dependencies:
- dependency-name: crate-ci/typos
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-17 16:47:15 +01:00