Skip to content
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

Add event with m.reference relation to unknown parent to the timeline. #4084

Conversation

maheichyk
Copy link
Contributor

@maheichyk maheichyk commented Feb 26, 2024

Currently event with m.reference relation to unknown parent event is not added to the timeline and therefore is not feed into the widget.

StopGapWidget.ts checks event to be in the timeline before the marker and if event is not found and marker is there then the event is ignored.

We in the widgets rely on this setup that a room event relates to another parent room event via m.reference and if parent event is not loaded (that happens when timeline is relatively big and user have to scroll timeline manually to get event loaded) the event is ignored.

Therefore this PR suggest to add this event to the timeline.

Checklist

  • Tests written for new code (and old code if feasible)
  • Linter and other CI checks pass
  • Sign-off given on the changes (see CONTRIBUTING.md)

Type: defect

Signed-off-by: Mikhail Aheichyk <mikhail.aheichyk@nordeck.net>
@maheichyk
Copy link
Contributor Author

@dbkr, @robintown I somehow cannot add a label (adding Type: defect to the PR description and I think it was working before to me) but all other checks are passing, please review.

@@ -2197,7 +2197,7 @@ export class Room extends ReadReceipt<RoomEmittedEvents, RoomEventHandlerMap> {
// Due to replies not being typical relations and being used as fallbacks for threads relations
// If we bypass the if case above then we know we are not a thread, so if we are still a reply
// then we know that we must be in the main timeline. Same goes if we have no associated parent event.
if (!parentEventId || !!event.replyEventId) {
if (!parentEventId || !!event.replyEventId || event.getRelation()?.rel_type === "m.reference") {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure I really see why an m.reference relation needs special treatment here: doesn't the logic apply to any relation that's not a thread (or possibly reply?) relation? Seems like any event with a kind of relation we don't know about, we should assume lives in the main thread? That said, I'd appreciate a second pair of eyes on this before actually suggesting this.

Also, the comment above (apart from having half a sentence) explains both clauses in the if condition, so if you add another, please update the comment to reflect it.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change breaks the public API of eventShouldLiveIn because it states:

  • Relations, redactions, replies where the parent cannot be found live in no timelines but should be aggregated regardless.

That being said, the comment on this if statement clearly intends for some events to hit this but not m.reference. It does make sense to me to chuck it in the main timeline rather than dropping it entirely IMO.

We are warned on :2209:

adding the event in the wrong timeline causes stuck notifications and can break ability to send read receipts

can we be sure this PR won't do this?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not that deep into this stuck notification topic and therefore currently could not really prove that adding m.reference or other event relations (that sounds reasonable) will not produce this issue.

But not adding the event to the timeline produces the problem that event is not sent to the widget. That was working some time ago because it was previously possible to see these events in the timeline via devtools.

Another solution could be to explicitly check these events in StopGapWidget and feed them to the widget without checking timeline, here is a PR for that : matrix-org/matrix-react-sdk#12283 Could that be a more real option?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At the moment I'm more inclined to go with the other PR, which seems broadly sensible. The more I think about this, the more I think that actually there's no way we can legitimately say events live in any timeline if we don't know about their parent, so what we should actually be doing is keeping them in a holding area somewhere until we can fetch their parent. That or use matrix-org/matrix-spec-proposals#4023

@maheichyk maheichyk requested review from kegsay and dbkr February 27, 2024 13:48
@maheichyk
Copy link
Contributor Author

maheichyk commented Mar 8, 2024

The main problem in relation to the widgets was resolved by another PR to matrix-react-sdk, although would be nice to have these events in the timeline to be shown by Element as well and not to have a special handling for the widgets.

@maheichyk maheichyk closed this Mar 8, 2024
@t3chguy
Copy link
Member

t3chguy commented Mar 8, 2024

@maheichyk a very related issue is tracked in element-hq/element-web#27132

@maheichyk
Copy link
Contributor Author

@maheichyk a very related issue is tracked in element-hq/element-web#27132

Yes, it is the same issue to me: event (with custom relation type) is ignored because the parent event is missing (not loaded yet) in the timeline. In our widget case I could see our custom events in the timeline when they are added by the widget with devtools, but when Element is reloaded I could not see any of those. I though that it was a synapse issue, but it was not, all widgets events could be loaded fine via relation to this parent event.

@t3chguy
Copy link
Member

t3chguy commented Mar 8, 2024

Its a tricky topic, the spec doesn't clearly outline how non-standard relations should interact with threads, and getting this wrong means stuck notifications due to the client & server treating those events as contained in different timelines. Ideally the client would be told which thread/main timeline the event belongs to deterministically (either top level thread_id or a value in unsigned) matrix-org/matrix-spec-proposals#4023 would be such a solution

@maheichyk maheichyk deleted the nic/feat/add_relation_reference_unknown_timeline branch March 9, 2024 14:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
T-Defect Z-Community-PR Issue is solved by a community member's PR
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants