-
Notifications
You must be signed in to change notification settings - Fork 399
MSC3030: Jump to date API endpoint #3030
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 2 commits
Commits
Show all changes
28 commits
Select commit
Hold shift + click to select a range
f4aa923
Initial MSC draft for jump to date
MadLittleMods 11025d6
Update with alternate /timestamp_to_event endpoint
MadLittleMods 95cd693
Add origin_server_ts for quick remote to local comparison
MadLittleMods 13910e7
Add origin_server_ts to client endpoint
MadLittleMods 2559770
Wrap lines
MadLittleMods f19a43a
Use stable when discussing MSC and document unstable
MadLittleMods f87a4f2
Describe the direction parameter
MadLittleMods d9b0bed
Add server support detection
MadLittleMods cc6a4a3
Fix typos
MadLittleMods 2c8cdd8
Explain what happens when an event can't be found
MadLittleMods 9aa73f4
Add context behind why we chose /timestamp_to_event vs alternatives
MadLittleMods fdd0022
Add comments about authentication and rate-limiting
MadLittleMods 8238dfe
Return pagination token directly in future iteration
MadLittleMods 75c157b
Abuse /timestamp_to_event to get create event
MadLittleMods cbd388f
Unrenderable events
MadLittleMods bb732d9
Add some complication thoughts around alternatives
MadLittleMods 4d2a45a
Backfill event so we can get pagination token
MadLittleMods 38b8147
Heuristic for which server to try first
MadLittleMods 067bdeb
Give a suggestion on where to backfill from
MadLittleMods 1804b71
Add alternative suggestion from @alphapapa
MadLittleMods 8ca7a08
Better wording and fix typo
MadLittleMods ad99b64
No difference in homeservers
MadLittleMods bc2be78
Fix typos
MadLittleMods 23cfab0
Fix extra word typo
MadLittleMods 509c1b4
Summarizing discussion around why `dir` instead of closest
MadLittleMods b8d7ba3
Adjust to just suggest the right way
MadLittleMods fabfb34
Great simplification with the same meaning 🌟
MadLittleMods 468a769
Perfect is the enemy of good
MadLittleMods File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
# MSC3030: Jump to date API endpoint | ||
turt2live marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
Add an API that makes it easy to find the closest messages for a given timestamp. | ||
|
||
The goal of this change is to have clients be able to implement a jump to date feature in order to see messages back at a given point in time. Pick a date from a calender, heatmap, or paginate next/previous between days and view all of the messages that were sent on that date. | ||
|
||
For our [roadmap of feature parity with Gitter](https://github.com/vector-im/roadmap/issues/26), we're also interested in using this for a new better static Matrix archive. Our idea is to server-side render [Hydrogen](https://github.com/vector-im/hydrogen-web) and this new endpoint would allow us to jump back on the fly without having to paginate and keep track of everything in order to display the selected date. | ||
|
||
Also useful for archiving and backup use cases. This new endpoint can be used to slice the messages by day and persist to file. | ||
|
||
Related issue: [*URL for an arbitrary day of history and navigation for next and previous days* (vector-im/element-web#7677)](https://github.com/vector-im/element-web/issues/7677) | ||
|
||
|
||
## Problem | ||
|
||
These types of use cases are not supported by the current Matrix API because it has no way to fetch or filter older messages besides a manual brute force pagination from the latest. Paginating is time-consuming and expensive to process every event as you go (not practical for clients). Imagine wanting to get a message from 3 years ago 😫 | ||
|
||
|
||
## Proposal | ||
|
||
|
||
Add new client API endpoint `GET /_matrix/client/r0/rooms/{roomId}/timestamp_to_event?ts=<timestamp>?dir=[f|b]` which fetches the closest event to the given timestamp `ts` query parameter in the direction specified by the `dir` query parameter. | ||
|
||
In order to solve the problem where a remote federated homeserver does not have all of the history in a room and no suitably close event, we also add a server API endpoint `GET /_matrix/federation/v1/timestamp_to_event/{roomId}?ts=<timestamp>?dir=[f|b]` which other homeservers can use to ask about their closest event to the timestamp. | ||
|
||
The heuristics for deciding when to ask another homeserver for a closer event if your homeserver doesn't have something close, is left up to the homeserver implementation. Although the heuristics will probably be based on whether the closest event is a forward/backward extremity indicating it's next to a gap of events which are potentially closer. | ||
MadLittleMods marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
--- | ||
|
||
In order to paginate `/messages`, we needa pagination token which we can get using `GET /_matrix/client/r0/rooms/{roomId}/context/{eventId}?limi=0` for the `event_id` returned by `/timestamp_to_event`. | ||
|
||
|
||
## Potential issues | ||
MadLittleMods marked this conversation as resolved.
Show resolved
Hide resolved
MadLittleMods marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
If you ask for "the message with `origin_server_ts` closest to Jan 1st 2018" you might actually get a rogue random delayed one that was backfilled from a federated server, but the human can figure that out by trying again with a slight variation on the date or something. | ||
|
||
|
||
## Alternatives | ||
|
||
|
||
### Paginate `/messages` from timestamp | ||
MadLittleMods marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
Add the `?around=<timestamp>` query parameter to the `GET /_matrix/client/r0/rooms/{roomId}/messages` endpoint. This will start the response at the message with `origin_server_ts` closest to the provided `around` timestamp. The direction is determined by the existing `?dir` query parameter. | ||
|
||
Use topoligical ordering, just as Element would use if you follow a permalink. | ||
MadLittleMods marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
### Filter by date in `RoomEventFilter` | ||
|
||
Extend `RoomEventFilter` to be able to specify a timestamp or a date range. The `RoomEventFilter` can be passed via the `?filter` query param on the `/messages` endpoint. | ||
|
||
|
||
### New `destination_server_ts` field | ||
|
||
Add a new field and index on messages called `destination_server_ts` which indicates when the message was received from federation. This gives a more "real" time for how someone would actually consume those messages. | ||
|
||
The contract of the API is "show me messages my server received at time T" rather than the messy confusion of showing a delayed message which happened to originally be sent at time T. | ||
|
||
We've decided against this approach because the backfill from federated servers could be horribly late. | ||
|
||
--- | ||
|
||
Related issue around `/sync` vs `/messages`, https://github.com/matrix-org/synapse/issues/7164 | ||
|
||
> Sync returns things in the order they arrive at the server; backfill returns them in the order determined by the event graph. | ||
> | ||
> *-- @richvdh, https://github.com/matrix-org/synapse/issues/7164#issuecomment-605877176* | ||
|
||
> The general idea is that, if you're following a room in real-time (ie, `/sync`), you probably want to see the messages as they arrive at your server, rather than skipping any that arrived late; whereas if you're looking at a historical section of timeline (ie, `/messages`), you want to see the best representation of the state of the room as others were seeing it at the time. | ||
> | ||
> *-- @richvdh , https://github.com/matrix-org/synapse/issues/7164#issuecomment-605953296* | ||
|
||
|
||
## Security considerations | ||
|
||
We're only going to expose messages according to the existing message history setting in the room (`m.room.history_visibility`). No extra data is exposed, just a new way to sort through it all. | ||
|
||
|
||
|
||
## Unstable prefix | ||
MadLittleMods marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
*If a proposal is implemented before it is included in the spec, then implementers must ensure that the | ||
implementation is compatible with the final version that lands in the spec. This generally means that | ||
experimental implementations should use `/unstable` endpoints, and use vendor prefixes where necessary. | ||
For more information, see [MSC2324](https://github.com/matrix-org/matrix-doc/pull/2324). This section | ||
should be used to document things such as what endpoints and names are being used while the feature is | ||
in development, the name of the unstable feature flag to use to detect support for the feature, or what | ||
migration steps are needed to switch to newer versions of the proposal.* |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.