MSC3925: m.replace aggregation with full event (#3925)

* init m.replace aggregation with full event

Signed-off-by: benkuly <kontakt@folivo.net>

* Rename tmp.md to 3925-replace-aggregation-with-full-event.md

Signed-off-by: benkuly <kontakt@folivo.net>

* Update 3925-replace-aggregation-with-full-event.md

typos

Signed-off-by: benkuly <kontakt@folivo.net>

* Update 3925-replace-aggregation-with-full-event.md

added MSC number

Signed-off-by: benkuly <kontakt@folivo.net>

* Update proposals/3925-replace-aggregation-with-full-event.md

Co-authored-by: Jonas Platte <jplatte+git@posteo.de>
Signed-off-by: benkuly <kontakt@folivo.net>

* Update proposals/3925-replace-aggregation-with-full-event.md

Co-authored-by: Jonas Platte <jplatte+git@posteo.de>
Signed-off-by: benkuly <kontakt@folivo.net>

* Update proposals/3925-replace-aggregation-with-full-event.md

Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>

* redact instead of delete

* Update proposals/3925-replace-aggregation-with-full-event.md

Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>

* Update proposals/3925-replace-aggregation-with-full-event.md

Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>

* word wrap 80

* remove immutable argument

* add alternative from https://github.com/matrix-org/matrix-spec/issues/1299#issuecomment-1290332433

* add json example

* shorter version of the actual proposal

Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>

* describe the actual reason, why encrypted events cannot be replaced

Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>

* mention discussion

* typo

* Update proposals/3925-replace-aggregation-with-full-event.md

Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>

* Update proposals/3925-replace-aggregation-with-full-event.md

Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>

* Update proposals/3925-replace-aggregation-with-full-event.md

Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>

* Update proposals/3925-replace-aggregation-with-full-event.md

Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>

* Update proposals/3925-replace-aggregation-with-full-event.md

Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>

* Update proposals/3925-replace-aggregation-with-full-event.md

Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>

* Update proposals/3925-replace-aggregation-with-full-event.md

Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>

* clarify inconsistent behavior with replaced contents

* Update proposals/3925-replace-aggregation-with-full-event.md

Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>

* Update proposals/3925-replace-aggregation-with-full-event.md

Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>

* Update proposals/3925-replace-aggregation-with-full-event.md

Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>

* Update proposals/3925-replace-aggregation-with-full-event.md

Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>

* clarify inconsistent behavior and put it into introduction

* remove superfluous event content field

* add some details to potential issues
suggested by @richvdh

---------

Signed-off-by: benkuly <kontakt@folivo.net>
Co-authored-by: Jonas Platte <jplatte+git@posteo.de>
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
pull/3972/head
benkuly 1 year ago committed by GitHub
parent 26f5effe45
commit 13935ec33b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -0,0 +1,140 @@
# MSC3925: m.replace aggregation with full event
As [currently specified](https://spec.matrix.org/v1.4/client-server-api/#server-side-replacement-of-content),
servers should replace the content of events that have been replaced via an `m.replace`
relation.
There are some issues with this requirement:
* Changing the fundamental concept of mostly immutable events is confusing. The server
can respond with different event contents for the same `event_id`.
* If an event with `m.replace` relation is redacted, clients need to
detect if the original content was replaced, and possibly need to fetch the
original content.
* Servers cannot replace the original event content for encrypted events (because the
replacement content is inside the encrypted body).
See [matrix-spec#1299](https://github.com/matrix-org/matrix-spec/issues/1299).
* Replacing the content can lead to inconsistent behavior on clients which don't
support replacing events.
Assume that we have this timeline on the server:
- `{"event_id": "E1", "content": {"body": "1"}}`
- `{"event_id": "E2", "content": {"body": "* 2", "m.new_content": {"body": "2"}}` // replaces `E1`
A `/sync` is done after `E2`. We will have this timeline on a client:
- `{"event_id": "E1", "content": {"body": "2"}}`
- `{"event_id": "E2", "content": {"body": "* 2"}`
Although `2` is a replaced body it does not have a `*`. This looks to the
user as if it is the original content of the event.
## Proposal
The following two changes are proposed:
1. The [server-side aggregation of `m.replace` relationships](https://spec.matrix.org/v1.4/client-server-api/#server-side-aggregation-of-mreplace-relationships)
is extended to be the entire content of the most recent replacement event, formatted
as described in [Room Event Format](https://spec.matrix.org/v1.4/client-server-api/#room-event-format).
This ensures that the client will always have the most recent edit without having to
fetch it from the server.
2. Servers should no longer replace the original content of an event as described
at https://spec.matrix.org/v1.4/client-server-api/#server-side-replacement-of-content.
For an original event:
```json5
{
"event_id": "$original_event",
"type": "m.room.message",
"content": {
"body": "I really like cake",
"msgtype": "m.text",
"formatted_body": "I really like cake"
}
// irrelevant fields not shown
}
```
With a replacing event:
```json5
{
"event_id": "$edit_event",
"type": "m.room.message",
"content": {
"body": "* I really like *chocolate* cake",
"msgtype": "m.text",
"m.new_content": {
"body": "I really like *chocolate* cake",
"msgtype": "m.text"
},
"m.relates_to": {
"rel_type": "m.replace",
"event_id": "$original_event_id"
}
}
// irrelevant fields not shown
}
```
This is how the original event would look like after the replacement:
```json5
{
"event_id": "$original_event",
"type": "m.room.message",
"content": {
"body": "I really like cake",
"msgtype": "m.text",
"formatted_body": "I really like cake"
},
"unsigned": {
"m.relations": {
"m.replace": {
"event_id": "$edit_event",
"type": "m.room.message",
"content": {
"body": "* I really like *chocolate* cake",
"msgtype": "m.text",
"m.new_content": {
"body": "I really like *chocolate* cake",
"msgtype": "m.text"
},
"m.relates_to": {
"rel_type": "m.replace",
"event_id": "$original_event_id"
}
}
// irrelevant fields not shown
}
}
}
// irrelevant fields not shown
}
```
## Potential issues
* There could be clients which rely on the current behavior:
* element-web relied on it until [matrix-org/matrix-js-sdk#3045](https://github.com/matrix-org/matrix-js-sdk/pull/3045)
* The failure mode is: suppose we have an event E, which was subsequently replaced by an event E'. Now, if jumped back to a bit of timeline that contains E but not E', then clients unaware of this change will show the original event E rather than the edited content E'. But: That is an edge-case and it already happens for events other than `m.room.message` (including encrypted events) due to [matrix-org/synapse#12503](https://github.com/matrix-org/synapse/issues/12503).
* It will be harder for clients which do not support replacing events to get
the current content of an event: currently they can just look at `content.body`.
However, there is an inconsistent behavior for clients that do not support
replacing events (see above).
## Alternatives
One [suggestion](https://github.com/matrix-org/matrix-spec/issues/1299#issuecomment-1290332433) is
to have the server return the complete replacement event instead of the original event. However, that would
break compatibility with existing clients and is a more invasive change.
## Security considerations
None currently foreseen.
## Unstable prefix
No unstable prefix is currently proposed.
Loading…
Cancel
Save