4949from synapse .api .room_versions import RoomVersion
5050from synapse .types import JsonDict , Requester
5151
52- from . import EventBase
52+ from . import EventBase , make_event_from_dict
5353
5454if TYPE_CHECKING :
5555 from synapse .handlers .relations import BundledAggregations
@@ -82,17 +82,14 @@ def prune_event(event: EventBase) -> EventBase:
8282 """
8383 pruned_event_dict = prune_event_dict (event .room_version , event .get_dict ())
8484
85- from . import make_event_from_dict
86-
8785 pruned_event = make_event_from_dict (
8886 pruned_event_dict , event .room_version , event .internal_metadata .get_dict ()
8987 )
9088
91- # copy the internal fields
89+ # Copy the bits of `internal_metadata` that aren't returned by `get_dict`
9290 pruned_event .internal_metadata .stream_ordering = (
9391 event .internal_metadata .stream_ordering
9492 )
95-
9693 pruned_event .internal_metadata .outlier = event .internal_metadata .outlier
9794
9895 # Mark the event as redacted
@@ -101,6 +98,29 @@ def prune_event(event: EventBase) -> EventBase:
10198 return pruned_event
10299
103100
101+ def clone_event (event : EventBase ) -> EventBase :
102+ """Take a copy of the event.
103+
104+ This is mostly useful because it does a *shallow* copy of the `unsigned` data,
105+ which means it can then be updated without corrupting the in-memory cache. Note that
106+ other properties of the event, such as `content`, are *not* (currently) copied here.
107+ """
108+ # XXX: We rely on at least one of `event.get_dict()` and `make_event_from_dict()`
109+ # making a copy of `unsigned`. Currently, both do, though I don't really know why.
110+ # Still, as long as they do, there's not much point doing yet another copy here.
111+ new_event = make_event_from_dict (
112+ event .get_dict (), event .room_version , event .internal_metadata .get_dict ()
113+ )
114+
115+ # Copy the bits of `internal_metadata` that aren't returned by `get_dict`.
116+ new_event .internal_metadata .stream_ordering = (
117+ event .internal_metadata .stream_ordering
118+ )
119+ new_event .internal_metadata .outlier = event .internal_metadata .outlier
120+
121+ return new_event
122+
123+
104124def prune_event_dict (room_version : RoomVersion , event_dict : JsonDict ) -> JsonDict :
105125 """Redacts the event_dict in the same way as `prune_event`, except it
106126 operates on dicts rather than event objects
0 commit comments