From 116eb4e0788634c209cfca39f311b28afcebfcfa Mon Sep 17 00:00:00 2001 From: benkuly <12199167+benkuly@users.noreply.github.com> Date: Thu, 3 Nov 2022 17:46:37 +0100 Subject: [PATCH 01/33] init m.replace aggregation with full event Signed-off-by: benkuly --- proposals/tmp.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 proposals/tmp.md diff --git a/proposals/tmp.md b/proposals/tmp.md new file mode 100644 index 00000000000..34a881a6160 --- /dev/null +++ b/proposals/tmp.md @@ -0,0 +1,38 @@ +# MSC0000: m.replace aggregation with full event + +The Matrix DAG has immutable PDUs forming an auth chain. The client representation of this PDUs are simply called events. +While this events also have been immutable until v1.3, since v1.4 they aren't. +When a client sends a `m.replace` relation, [the server should replace the content of the original event](https://spec.matrix.org/v1.4/client-server-api/#server-side-replacement-of-content). + +There are some issues with this requirment: +* Changing the fundamental concept of immutable events is confusing. The server can response different event contents for the same `event_id`. +* If an event with `m.replace` relation is deleted, the client would need to detect, if the content was replaced and possibly needs to fetch the original event. +* There is an additional server call needed, when the replacing event is encrypted, because the server cannot replace the original event content. +* There are also some other issues with this spec paragraph, which are discussed [here](https://github.com/matrix-org/matrix-spec/issues/1299) + +## Proposal + +Instead of replacing the original content of an event, servers should use the aggregation feature for it. +In fact it is [already used](https://spec.matrix.org/v1.4/client-server-api/#server-side-aggregation-of-mreplace-relationships), +but only `event_id`, `origin_server_ts` and `sender` are included. +Theoretically this is enough to get the replacing content, but when the event with the `event_id` cannot be found locally it needs to be fetched from the server. +To prevent this additional call to the server, the `m.replace` aggregation should just contain the complete replacing event. + +The additional server call is already needed for encrypted events and would be saved by this proposal too. + +## Potential issues + +* There could be clients, which rely on the current behavior. +* It is not as easy for clients like as in the current spec to get the current content of an event by just looking into `content.body`. While this true, it is also a relatively inconsistent behavior. Future replacements of the event would be rendered as "* new content". So the event with the replaced event does look different (without "*") despite the fact, that it is also replaced. + +## Alternatives + + + +## Security considerations + + + +## Unstable prefix + +I'm not sure, if we need an unsable prefix, because the aggregation would just be extended by additional fields. From 88c434d512915ee7c86d89f4ffdd8635639e4db4 Mon Sep 17 00:00:00 2001 From: benkuly <12199167+benkuly@users.noreply.github.com> Date: Thu, 3 Nov 2022 17:49:06 +0100 Subject: [PATCH 02/33] Rename tmp.md to 3925-replace-aggregation-with-full-event.md Signed-off-by: benkuly --- proposals/{tmp.md => 3925-replace-aggregation-with-full-event.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename proposals/{tmp.md => 3925-replace-aggregation-with-full-event.md} (100%) diff --git a/proposals/tmp.md b/proposals/3925-replace-aggregation-with-full-event.md similarity index 100% rename from proposals/tmp.md rename to proposals/3925-replace-aggregation-with-full-event.md From 5a54a03dde70070c89c26906c9a1eb1b0421c100 Mon Sep 17 00:00:00 2001 From: benkuly <12199167+benkuly@users.noreply.github.com> Date: Thu, 3 Nov 2022 17:52:24 +0100 Subject: [PATCH 03/33] Update 3925-replace-aggregation-with-full-event.md typos Signed-off-by: benkuly --- proposals/3925-replace-aggregation-with-full-event.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index 34a881a6160..d54669dd3ff 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -4,9 +4,9 @@ The Matrix DAG has immutable PDUs forming an auth chain. The client representati While this events also have been immutable until v1.3, since v1.4 they aren't. When a client sends a `m.replace` relation, [the server should replace the content of the original event](https://spec.matrix.org/v1.4/client-server-api/#server-side-replacement-of-content). -There are some issues with this requirment: -* Changing the fundamental concept of immutable events is confusing. The server can response different event contents for the same `event_id`. -* If an event with `m.replace` relation is deleted, the client would need to detect, if the content was replaced and possibly needs to fetch the original event. +There are some issues with this requirement: +* Changing the fundamental concept of 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 deleted, the client would need to detect, if the original content was replaced and possibly needs to fetch the original content. * There is an additional server call needed, when the replacing event is encrypted, because the server cannot replace the original event content. * There are also some other issues with this spec paragraph, which are discussed [here](https://github.com/matrix-org/matrix-spec/issues/1299) From a065b00fb4bf382d33aa8a19fb1ad904510b8b99 Mon Sep 17 00:00:00 2001 From: benkuly <12199167+benkuly@users.noreply.github.com> Date: Thu, 3 Nov 2022 17:55:26 +0100 Subject: [PATCH 04/33] Update 3925-replace-aggregation-with-full-event.md added MSC number Signed-off-by: benkuly --- proposals/3925-replace-aggregation-with-full-event.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index d54669dd3ff..66e3910bee1 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -1,4 +1,4 @@ -# MSC0000: m.replace aggregation with full event +# MSC3925: m.replace aggregation with full event The Matrix DAG has immutable PDUs forming an auth chain. The client representation of this PDUs are simply called events. While this events also have been immutable until v1.3, since v1.4 they aren't. From 4f5ecde6be4261e924ebe3148c58a4f861dd6a4c Mon Sep 17 00:00:00 2001 From: benkuly <12199167+benkuly@users.noreply.github.com> Date: Fri, 4 Nov 2022 09:27:21 +0100 Subject: [PATCH 05/33] Update proposals/3925-replace-aggregation-with-full-event.md Co-authored-by: Jonas Platte Signed-off-by: benkuly --- proposals/3925-replace-aggregation-with-full-event.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index 66e3910bee1..0c2db03c068 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -1,7 +1,7 @@ # MSC3925: m.replace aggregation with full event The Matrix DAG has immutable PDUs forming an auth chain. The client representation of this PDUs are simply called events. -While this events also have been immutable until v1.3, since v1.4 they aren't. +While these events also have been immutable until v1.3, since v1.4 they aren't. When a client sends a `m.replace` relation, [the server should replace the content of the original event](https://spec.matrix.org/v1.4/client-server-api/#server-side-replacement-of-content). There are some issues with this requirement: From 6ea54866ba7bdd5370914f170e5e52e212cc5cf8 Mon Sep 17 00:00:00 2001 From: benkuly <12199167+benkuly@users.noreply.github.com> Date: Fri, 4 Nov 2022 09:27:31 +0100 Subject: [PATCH 06/33] Update proposals/3925-replace-aggregation-with-full-event.md Co-authored-by: Jonas Platte Signed-off-by: benkuly --- proposals/3925-replace-aggregation-with-full-event.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index 0c2db03c068..73b84e67c0f 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -35,4 +35,4 @@ The additional server call is already needed for encrypted events and would be s ## Unstable prefix -I'm not sure, if we need an unsable prefix, because the aggregation would just be extended by additional fields. +I'm not sure, if we need an unstable prefix, because the aggregation would just be extended by additional fields. From 09602eb7842245a5346cb4a5f8fb59a5797cbac8 Mon Sep 17 00:00:00 2001 From: benkuly <12199167+benkuly@users.noreply.github.com> Date: Tue, 8 Nov 2022 16:34:57 +0100 Subject: [PATCH 07/33] Update proposals/3925-replace-aggregation-with-full-event.md Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- proposals/3925-replace-aggregation-with-full-event.md | 1 - 1 file changed, 1 deletion(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index 73b84e67c0f..40f705ce081 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -1,6 +1,5 @@ # MSC3925: m.replace aggregation with full event -The Matrix DAG has immutable PDUs forming an auth chain. The client representation of this PDUs are simply called events. While these events also have been immutable until v1.3, since v1.4 they aren't. When a client sends a `m.replace` relation, [the server should replace the content of the original event](https://spec.matrix.org/v1.4/client-server-api/#server-side-replacement-of-content). From 3876a46bf5d074a51cdf66bbb93446d285849f65 Mon Sep 17 00:00:00 2001 From: benkuly Date: Tue, 8 Nov 2022 16:37:15 +0100 Subject: [PATCH 08/33] redact instead of delete --- proposals/3925-replace-aggregation-with-full-event.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index 73b84e67c0f..90a78697d23 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -6,7 +6,7 @@ When a client sends a `m.replace` relation, [the server should replace the conte There are some issues with this requirement: * Changing the fundamental concept of 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 deleted, the client would need to detect, if the original content was replaced and possibly needs to fetch the original content. +* If an event with `m.replace` relation is redacted, the client would need to detect, if the original content was replaced and possibly needs to fetch the original content. * There is an additional server call needed, when the replacing event is encrypted, because the server cannot replace the original event content. * There are also some other issues with this spec paragraph, which are discussed [here](https://github.com/matrix-org/matrix-spec/issues/1299) From 97dfdcee050325b7ae30396d9fb94a94d1aecea1 Mon Sep 17 00:00:00 2001 From: benkuly <12199167+benkuly@users.noreply.github.com> Date: Tue, 8 Nov 2022 16:37:41 +0100 Subject: [PATCH 09/33] Update proposals/3925-replace-aggregation-with-full-event.md Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- proposals/3925-replace-aggregation-with-full-event.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index 40f705ce081..918a2454c2d 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -21,7 +21,7 @@ The additional server call is already needed for encrypted events and would be s ## Potential issues -* There could be clients, which rely on the current behavior. +* There could be clients which rely on the current behavior. * It is not as easy for clients like as in the current spec to get the current content of an event by just looking into `content.body`. While this true, it is also a relatively inconsistent behavior. Future replacements of the event would be rendered as "* new content". So the event with the replaced event does look different (without "*") despite the fact, that it is also replaced. ## Alternatives From c0ec33d47b69f10deb8b5a5834faaa07f5ca701f Mon Sep 17 00:00:00 2001 From: benkuly <12199167+benkuly@users.noreply.github.com> Date: Tue, 8 Nov 2022 16:39:00 +0100 Subject: [PATCH 10/33] Update proposals/3925-replace-aggregation-with-full-event.md Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- proposals/3925-replace-aggregation-with-full-event.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index 918a2454c2d..1268f4f01f5 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -34,4 +34,4 @@ The additional server call is already needed for encrypted events and would be s ## Unstable prefix -I'm not sure, if we need an unstable prefix, because the aggregation would just be extended by additional fields. +I'm not sure if we need an unstable prefix, because the aggregation would just be extended by additional fields. From 0bba4e4f0b887c859c38b8242512919369a87674 Mon Sep 17 00:00:00 2001 From: benkuly Date: Tue, 8 Nov 2022 16:45:51 +0100 Subject: [PATCH 11/33] word wrap 80 --- ...925-replace-aggregation-with-full-event.md | 46 ++++++++++++------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index f2b7e906430..df0308ce0ff 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -1,37 +1,51 @@ # MSC3925: m.replace aggregation with full event While these events also have been immutable until v1.3, since v1.4 they aren't. -When a client sends a `m.replace` relation, [the server should replace the content of the original event](https://spec.matrix.org/v1.4/client-server-api/#server-side-replacement-of-content). +When a client sends a `m.replace` +relation, [the server should replace the content of the original event](https://spec.matrix.org/v1.4/client-server-api/#server-side-replacement-of-content). There are some issues with this requirement: -* Changing the fundamental concept of 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, the client would need to detect, if the original content was replaced and possibly needs to fetch the original content. -* There is an additional server call needed, when the replacing event is encrypted, because the server cannot replace the original event content. -* There are also some other issues with this spec paragraph, which are discussed [here](https://github.com/matrix-org/matrix-spec/issues/1299) + +* Changing the fundamental concept of 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, the client would need to + detect, if the original content was replaced and possibly needs to fetch the + original content. +* There is an additional server call needed, when the replacing event is + encrypted, because the server cannot replace the original event content. +* There are also some other issues with this spec paragraph, which are + discussed [here](https://github.com/matrix-org/matrix-spec/issues/1299) ## Proposal -Instead of replacing the original content of an event, servers should use the aggregation feature for it. -In fact it is [already used](https://spec.matrix.org/v1.4/client-server-api/#server-side-aggregation-of-mreplace-relationships), +Instead of replacing the original content of an event, servers should use the +aggregation feature for it. +In fact it +is [already used](https://spec.matrix.org/v1.4/client-server-api/#server-side-aggregation-of-mreplace-relationships), but only `event_id`, `origin_server_ts` and `sender` are included. -Theoretically this is enough to get the replacing content, but when the event with the `event_id` cannot be found locally it needs to be fetched from the server. -To prevent this additional call to the server, the `m.replace` aggregation should just contain the complete replacing event. +Theoretically this is enough to get the replacing content, but when the event +with the `event_id` cannot be found locally it needs to be fetched from the +server. +To prevent this additional call to the server, the `m.replace` aggregation +should just contain the complete replacing event. -The additional server call is already needed for encrypted events and would be saved by this proposal too. +The additional server call is already needed for encrypted events and would be +saved by this proposal too. ## Potential issues * There could be clients which rely on the current behavior. -* It is not as easy for clients like as in the current spec to get the current content of an event by just looking into `content.body`. While this true, it is also a relatively inconsistent behavior. Future replacements of the event would be rendered as "* new content". So the event with the replaced event does look different (without "*") despite the fact, that it is also replaced. +* It is not as easy for clients like as in the current spec to get the current + content of an event by just looking into `content.body`. While this true, it + is also a relatively inconsistent behavior. Future replacements of the event + would be rendered as "* new content". So the event with the replaced event + does look different (without "*") despite the fact, that it is also replaced. ## Alternatives - - ## Security considerations - - ## Unstable prefix -I'm not sure if we need an unstable prefix, because the aggregation would just be extended by additional fields. +I'm not sure if we need an unstable prefix, because the aggregation would just +be extended by additional fields. From db0ca3eab1cb172e41234bfa87136d35a72ac639 Mon Sep 17 00:00:00 2001 From: benkuly Date: Tue, 8 Nov 2022 16:47:06 +0100 Subject: [PATCH 12/33] remove immutable argument --- proposals/3925-replace-aggregation-with-full-event.md | 1 - 1 file changed, 1 deletion(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index df0308ce0ff..82e08911f6d 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -1,6 +1,5 @@ # MSC3925: m.replace aggregation with full event -While these events also have been immutable until v1.3, since v1.4 they aren't. When a client sends a `m.replace` relation, [the server should replace the content of the original event](https://spec.matrix.org/v1.4/client-server-api/#server-side-replacement-of-content). From ff6fc377b38f4a416f48da5a81d2fbc62b5cf6a5 Mon Sep 17 00:00:00 2001 From: benkuly Date: Tue, 8 Nov 2022 16:58:06 +0100 Subject: [PATCH 13/33] add alternative from https://github.com/matrix-org/matrix-spec/issues/1299#issuecomment-1290332433 --- proposals/3925-replace-aggregation-with-full-event.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index 82e08911f6d..e4b03c3b755 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -42,6 +42,13 @@ saved by this proposal too. ## Alternatives +We could flip the event stack on it's head and have the outer event +be the edit and then in unsigned have the base event being edited. Currently, it +is the inverse where we have the original event and then in unsigned the newer +event sits. That way, if someone doesn't care about edits (because not +implemented) then they see the right thing, and when someone does care about them, they +can just inspect unsigned to present the "edits" dialog. + ## Security considerations ## Unstable prefix From 291b921bfc46b9be9ba310482a721ef975bfe25e Mon Sep 17 00:00:00 2001 From: benkuly Date: Tue, 8 Nov 2022 17:04:26 +0100 Subject: [PATCH 14/33] add json example --- ...925-replace-aggregation-with-full-event.md | 81 ++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index e4b03c3b755..c400a69a035 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -31,6 +31,84 @@ should just contain the complete replacing event. The additional server call is already needed for encrypted events and would be saved by this proposal too. +For an original event: + +```json +{ + "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: + +```json +{ + "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", + "com.example.extension_property": "chocolate" + }, + "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: + +```json +{ + "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", + "com.example.extension_property": "chocolate" + }, + "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. @@ -46,7 +124,8 @@ We could flip the event stack on it's head and have the outer event be the edit and then in unsigned have the base event being edited. Currently, it is the inverse where we have the original event and then in unsigned the newer event sits. That way, if someone doesn't care about edits (because not -implemented) then they see the right thing, and when someone does care about them, they +implemented) then they see the right thing, and when someone does care about +them, they can just inspect unsigned to present the "edits" dialog. ## Security considerations From 8a4f38fcb5a0141bf8e7e32590c6752230c7ac69 Mon Sep 17 00:00:00 2001 From: benkuly Date: Tue, 8 Nov 2022 17:08:00 +0100 Subject: [PATCH 15/33] shorter version of the actual proposal Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- ...925-replace-aggregation-with-full-event.md | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index c400a69a035..6a1ef994ac3 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -17,19 +17,14 @@ There are some issues with this requirement: ## Proposal -Instead of replacing the original content of an event, servers should use the -aggregation feature for it. -In fact it -is [already used](https://spec.matrix.org/v1.4/client-server-api/#server-side-aggregation-of-mreplace-relationships), -but only `event_id`, `origin_server_ts` and `sender` are included. -Theoretically this is enough to get the replacing content, but when the event -with the `event_id` cannot be found locally it needs to be fetched from the -server. -To prevent this additional call to the server, the `m.replace` aggregation -should just contain the complete replacing event. - -The additional server call is already needed for encrypted events and would be -saved by this proposal too. +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: From e365e01b2c3603af4e39291d1c30b5a9f64a7acc Mon Sep 17 00:00:00 2001 From: benkuly Date: Tue, 8 Nov 2022 17:11:29 +0100 Subject: [PATCH 16/33] describe the actual reason, why encrypted events cannot be replaced Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- proposals/3925-replace-aggregation-with-full-event.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index 6a1ef994ac3..b5dff129b6e 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -10,8 +10,9 @@ There are some issues with this requirement: * If an event with `m.replace` relation is redacted, the client would need to detect, if the original content was replaced and possibly needs to fetch the original content. -* There is an additional server call needed, when the replacing event is - encrypted, because the server cannot replace the original event content. +* Server 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). * There are also some other issues with this spec paragraph, which are discussed [here](https://github.com/matrix-org/matrix-spec/issues/1299) From 05ecbe5ea05bbf36d134ddb5e4fa55163469a6c9 Mon Sep 17 00:00:00 2001 From: benkuly Date: Tue, 8 Nov 2022 17:16:50 +0100 Subject: [PATCH 17/33] mention discussion --- proposals/3925-replace-aggregation-with-full-event.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index b5dff129b6e..a7143af1818 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -5,7 +5,7 @@ relation, [the server should replace the content of the original event](https:// There are some issues with this requirement: -* Changing the fundamental concept of immutable events is confusing. The server +* 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, the client would need to detect, if the original content was replaced and possibly needs to fetch the @@ -13,8 +13,8 @@ There are some issues with this requirement: * Server 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). -* There are also some other issues with this spec paragraph, which are - discussed [here](https://github.com/matrix-org/matrix-spec/issues/1299) + +There is a discussion about this spec paragraph [here](https://github.com/matrix-org/matrix-spec/issues/1299). ## Proposal From 919edb5fa7202ed98a620251487d4c28b22450f6 Mon Sep 17 00:00:00 2001 From: benkuly Date: Tue, 8 Nov 2022 17:22:06 +0100 Subject: [PATCH 18/33] typo --- proposals/3925-replace-aggregation-with-full-event.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index a7143af1818..333fe48d4ca 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -109,7 +109,7 @@ This is how the original event would look like after the replacement: * There could be clients which rely on the current behavior. * It is not as easy for clients like as in the current spec to get the current - content of an event by just looking into `content.body`. While this true, it + content of an event by just looking into `content.body`. While this is true, it is also a relatively inconsistent behavior. Future replacements of the event would be rendered as "* new content". So the event with the replaced event does look different (without "*") despite the fact, that it is also replaced. From 8fb8814321c0bf1a594bea977af643e5618340dc Mon Sep 17 00:00:00 2001 From: benkuly <12199167+benkuly@users.noreply.github.com> Date: Fri, 11 Nov 2022 16:27:17 +0100 Subject: [PATCH 19/33] Update proposals/3925-replace-aggregation-with-full-event.md Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- proposals/3925-replace-aggregation-with-full-event.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index 333fe48d4ca..c5496e7fade 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -10,7 +10,7 @@ There are some issues with this requirement: * If an event with `m.replace` relation is redacted, the client would need to detect, if the original content was replaced and possibly needs to fetch the original content. -* Server cannot replace the original event content for encrypted events (because the +* 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). From eac5551672cdc836e68425329b8f1dcc00b4cd69 Mon Sep 17 00:00:00 2001 From: benkuly <12199167+benkuly@users.noreply.github.com> Date: Fri, 11 Nov 2022 16:27:32 +0100 Subject: [PATCH 20/33] Update proposals/3925-replace-aggregation-with-full-event.md Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- proposals/3925-replace-aggregation-with-full-event.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index c5496e7fade..9141ef9848e 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -126,6 +126,8 @@ can just inspect unsigned to present the "edits" dialog. ## Security considerations +None currently foreseen. + ## Unstable prefix I'm not sure if we need an unstable prefix, because the aggregation would just From 5aced11f93582a8e881379512831686e1f954631 Mon Sep 17 00:00:00 2001 From: benkuly <12199167+benkuly@users.noreply.github.com> Date: Fri, 11 Nov 2022 16:27:45 +0100 Subject: [PATCH 21/33] Update proposals/3925-replace-aggregation-with-full-event.md Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- proposals/3925-replace-aggregation-with-full-event.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index 9141ef9848e..9fff6b1dc63 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -130,5 +130,4 @@ None currently foreseen. ## Unstable prefix -I'm not sure if we need an unstable prefix, because the aggregation would just -be extended by additional fields. +No unstable prefix is currently proposed. From fe75f9c252def069eafa2337872d5e356d9097b8 Mon Sep 17 00:00:00 2001 From: benkuly <12199167+benkuly@users.noreply.github.com> Date: Fri, 11 Nov 2022 16:28:07 +0100 Subject: [PATCH 22/33] Update proposals/3925-replace-aggregation-with-full-event.md Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- proposals/3925-replace-aggregation-with-full-event.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index 9fff6b1dc63..08c5267683e 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -108,8 +108,8 @@ This is how the original event would look like after the replacement: ## Potential issues * There could be clients which rely on the current behavior. -* It is not as easy for clients like as in the current spec to get the current - content of an event by just looking into `content.body`. While this is true, it +* It will be harder for clients to get the current content of an event: currently + they can just looking at `content.body`. While this is true, it is also a relatively inconsistent behavior. Future replacements of the event would be rendered as "* new content". So the event with the replaced event does look different (without "*") despite the fact, that it is also replaced. From 767acad3add0e87dfc62c0b49d0ad0967fa1b8bf Mon Sep 17 00:00:00 2001 From: benkuly <12199167+benkuly@users.noreply.github.com> Date: Fri, 11 Nov 2022 16:28:49 +0100 Subject: [PATCH 23/33] Update proposals/3925-replace-aggregation-with-full-event.md Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- proposals/3925-replace-aggregation-with-full-event.md | 1 - 1 file changed, 1 deletion(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index 08c5267683e..fb01e3ccb43 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -14,7 +14,6 @@ There are some issues with this requirement: replacement content is inside the encrypted body). See [matrix-spec#1299](https://github.com/matrix-org/matrix-spec/issues/1299). -There is a discussion about this spec paragraph [here](https://github.com/matrix-org/matrix-spec/issues/1299). ## Proposal From e3a461e2b757cbb9f73f98e9e89a9bac7205e2a6 Mon Sep 17 00:00:00 2001 From: benkuly <12199167+benkuly@users.noreply.github.com> Date: Fri, 11 Nov 2022 16:29:23 +0100 Subject: [PATCH 24/33] Update proposals/3925-replace-aggregation-with-full-event.md Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- proposals/3925-replace-aggregation-with-full-event.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index fb01e3ccb43..42dd6d387d9 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -1,7 +1,8 @@ # MSC3925: m.replace aggregation with full event -When a client sends a `m.replace` -relation, [the server should replace the content of the original event](https://spec.matrix.org/v1.4/client-server-api/#server-side-replacement-of-content). +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: From b84a03a86cf10179f04593270f53ca011addbf34 Mon Sep 17 00:00:00 2001 From: benkuly <12199167+benkuly@users.noreply.github.com> Date: Fri, 11 Nov 2022 16:29:42 +0100 Subject: [PATCH 25/33] Update proposals/3925-replace-aggregation-with-full-event.md Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- proposals/3925-replace-aggregation-with-full-event.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index 42dd6d387d9..15a6b15a538 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -8,8 +8,8 @@ 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, the client would need to - detect, if the original content was replaced and possibly needs to fetch the +* 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). From 5bfffb4ddf7c4da863ca71bdd1eaab26dd272239 Mon Sep 17 00:00:00 2001 From: benkuly Date: Fri, 11 Nov 2022 16:47:41 +0100 Subject: [PATCH 26/33] clarify inconsistent behavior with replaced contents --- ...925-replace-aggregation-with-full-event.md | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index 15a6b15a538..b54815a0f04 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -29,7 +29,7 @@ The following two changes are proposed: For an original event: -```json +```json5 { "event_id": "$original_event", "type": "m.room.message", @@ -45,7 +45,7 @@ For an original event: With a replacing event: -```json +```json5 { "event_id": "$edit_event", "type": "m.room.message", @@ -69,7 +69,7 @@ With a replacing event: This is how the original event would look like after the replacement: -```json +```json5 { "event_id": "$original_event", "type": "m.room.message", @@ -108,11 +108,16 @@ This is how the original event would look like after the replacement: ## Potential issues * There could be clients which rely on the current behavior. -* It will be harder for clients to get the current content of an event: currently - they can just looking at `content.body`. While this is true, it - is also a relatively inconsistent behavior. Future replacements of the event - would be rendered as "* new content". So the event with the replaced event - does look different (without "*") despite the fact, that it is also replaced. +* 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, this leads to a relatively inconsistent behavior: + + Assuming that we have an event A with the body `1`, which is first replaced by + the event A' with the new body `2` and then by the event A'' with the new body + `3`. The sync has been done right after A' und A''. Then the timeline + would look like this: `2` -> `*3` instead of `1` -> `*2` -> `*3`. Although `2` + is a replaced body, it does not have a `*`, which looks to the user as it has + not been replaced. ## Alternatives From 1ea94a27511224c74ccb4eca9d37e130196ed15a Mon Sep 17 00:00:00 2001 From: benkuly Date: Fri, 11 Nov 2022 16:50:09 +0100 Subject: [PATCH 27/33] Update proposals/3925-replace-aggregation-with-full-event.md Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- proposals/3925-replace-aggregation-with-full-event.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index b54815a0f04..94b3ab825da 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -121,13 +121,9 @@ This is how the original event would look like after the replacement: ## Alternatives -We could flip the event stack on it's head and have the outer event -be the edit and then in unsigned have the base event being edited. Currently, it -is the inverse where we have the original event and then in unsigned the newer -event sits. That way, if someone doesn't care about edits (because not -implemented) then they see the right thing, and when someone does care about -them, they -can just inspect unsigned to present the "edits" dialog. +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 From fae2c26ade02e0430ed0a7e7f879d01ae8d2563a Mon Sep 17 00:00:00 2001 From: benkuly <12199167+benkuly@users.noreply.github.com> Date: Tue, 15 Nov 2022 16:58:17 +0100 Subject: [PATCH 28/33] Update proposals/3925-replace-aggregation-with-full-event.md Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- proposals/3925-replace-aggregation-with-full-event.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index 94b3ab825da..da9fa9245b6 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -108,7 +108,7 @@ This is how the original event would look like after the replacement: ## Potential issues * There could be clients which rely on the current behavior. -* It will be harder for clients, which do not support replacing events to get +* 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, this leads to a relatively inconsistent behavior: From ee0dffacb64551e8895fa4095a6cc4c8cd0132a4 Mon Sep 17 00:00:00 2001 From: benkuly <12199167+benkuly@users.noreply.github.com> Date: Tue, 15 Nov 2022 16:58:24 +0100 Subject: [PATCH 29/33] Update proposals/3925-replace-aggregation-with-full-event.md Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- proposals/3925-replace-aggregation-with-full-event.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index da9fa9245b6..df06698f4e2 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -112,7 +112,7 @@ This is how the original event would look like after the replacement: the current content of an event: currently they can just look at `content.body`. However, this leads to a relatively inconsistent behavior: - Assuming that we have an event A with the body `1`, which is first replaced by + Assume that we have an event A with the body `1`, which is first replaced by the event A' with the new body `2` and then by the event A'' with the new body `3`. The sync has been done right after A' und A''. Then the timeline would look like this: `2` -> `*3` instead of `1` -> `*2` -> `*3`. Although `2` From fd37307f01ed905a450988d74edc88256c11da4a Mon Sep 17 00:00:00 2001 From: benkuly <12199167+benkuly@users.noreply.github.com> Date: Tue, 15 Nov 2022 16:58:38 +0100 Subject: [PATCH 30/33] Update proposals/3925-replace-aggregation-with-full-event.md Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- proposals/3925-replace-aggregation-with-full-event.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index df06698f4e2..da1b4b7ea3a 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -114,7 +114,7 @@ This is how the original event would look like after the replacement: Assume that we have an event A with the body `1`, which is first replaced by the event A' with the new body `2` and then by the event A'' with the new body - `3`. The sync has been done right after A' und A''. Then the timeline + `3`. A `/sync` is done right after A' and A''. Then the timeline would look like this: `2` -> `*3` instead of `1` -> `*2` -> `*3`. Although `2` is a replaced body, it does not have a `*`, which looks to the user as it has not been replaced. From efc60604fed2240cc27606866bd06ee44eacfb0b Mon Sep 17 00:00:00 2001 From: benkuly Date: Tue, 15 Nov 2022 18:06:39 +0100 Subject: [PATCH 31/33] clarify inconsistent behavior and put it into introduction --- ...925-replace-aggregation-with-full-event.md | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index da1b4b7ea3a..95939f5ee96 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -14,6 +14,18 @@ There are some issues with this requirement: * 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 @@ -110,14 +122,8 @@ This is how the original event would look like after the replacement: * There could be clients which rely on the current behavior. * 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, this leads to a relatively inconsistent behavior: - - Assume that we have an event A with the body `1`, which is first replaced by - the event A' with the new body `2` and then by the event A'' with the new body - `3`. A `/sync` is done right after A' and A''. Then the timeline - would look like this: `2` -> `*3` instead of `1` -> `*2` -> `*3`. Although `2` - is a replaced body, it does not have a `*`, which looks to the user as it has - not been replaced. + However, there is an inconsistent behavior for clients that do not support + replacing events (see above). ## Alternatives From 64da1698a274e8dde66a34dec1de9c5cb811817c Mon Sep 17 00:00:00 2001 From: benkuly Date: Wed, 8 Feb 2023 09:51:38 +0100 Subject: [PATCH 32/33] remove superfluous event content field --- proposals/3925-replace-aggregation-with-full-event.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index 95939f5ee96..bd12c604cb3 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -66,8 +66,7 @@ With a replacing event: "msgtype": "m.text", "m.new_content": { "body": "I really like *chocolate* cake", - "msgtype": "m.text", - "com.example.extension_property": "chocolate" + "msgtype": "m.text" }, "m.relates_to": { "rel_type": "m.replace", @@ -100,8 +99,7 @@ This is how the original event would look like after the replacement: "msgtype": "m.text", "m.new_content": { "body": "I really like *chocolate* cake", - "msgtype": "m.text", - "com.example.extension_property": "chocolate" + "msgtype": "m.text" }, "m.relates_to": { "rel_type": "m.replace", From 3d9e2abbb157a6b5609527d83bb144f12d804969 Mon Sep 17 00:00:00 2001 From: benkuly Date: Wed, 8 Feb 2023 10:00:07 +0100 Subject: [PATCH 33/33] add some details to potential issues suggested by @richvdh --- proposals/3925-replace-aggregation-with-full-event.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/proposals/3925-replace-aggregation-with-full-event.md b/proposals/3925-replace-aggregation-with-full-event.md index bd12c604cb3..4137320ad04 100644 --- a/proposals/3925-replace-aggregation-with-full-event.md +++ b/proposals/3925-replace-aggregation-with-full-event.md @@ -117,7 +117,9 @@ This is how the original event would look like after the replacement: ## Potential issues -* There could be clients which rely on the current behavior. +* 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