diff options
Diffstat (limited to 'synapse/events/utils.py')
-rw-r--r-- | synapse/events/utils.py | 64 |
1 files changed, 22 insertions, 42 deletions
diff --git a/synapse/events/utils.py b/synapse/events/utils.py index 84ef69df67..e5967c995e 100644 --- a/synapse/events/utils.py +++ b/synapse/events/utils.py @@ -306,7 +306,6 @@ def format_event_for_client_v2_without_room_id(d: JsonDict) -> JsonDict: def serialize_event( e: Union[JsonDict, EventBase], time_now_ms: int, - *, as_client_event: bool = True, event_format: Callable[[JsonDict], JsonDict] = format_event_for_client_v1, token_id: Optional[str] = None, @@ -394,8 +393,7 @@ class EventClientSerializer: self, event: Union[JsonDict, EventBase], time_now: int, - *, - bundle_aggregations: bool = True, + bundle_relations: bool = True, **kwargs: Any, ) -> JsonDict: """Serializes a single event. @@ -403,9 +401,8 @@ class EventClientSerializer: Args: event: The event being serialized. time_now: The current time in milliseconds - bundle_aggregations: Whether to include the bundled aggregations for this - event. Only applies to non-state events. (State events never include - bundled aggregations.) + bundle_relations: Whether to include the bundled relations for this + event. **kwargs: Arguments to pass to `serialize_event` Returns: @@ -417,27 +414,20 @@ class EventClientSerializer: serialized_event = serialize_event(event, time_now, **kwargs) - # Check if there are any bundled aggregations to include with the event. - # - # Do not bundle aggregations if any of the following at true: - # - # * Support is disabled via the configuration or the caller. - # * The event is a state event. - # * The event has been redacted. - if ( - self._msc1849_enabled - and bundle_aggregations - and not event.is_state() - and not event.internal_metadata.is_redacted() + # If MSC1849 is enabled then we need to look if there are any relations + # we need to bundle in with the event. + # Do not bundle relations if the event has been redacted + if not event.internal_metadata.is_redacted() and ( + self._msc1849_enabled and bundle_relations ): - await self._injected_bundled_aggregations(event, time_now, serialized_event) + await self._injected_bundled_relations(event, time_now, serialized_event) return serialized_event - async def _injected_bundled_aggregations( + async def _injected_bundled_relations( self, event: EventBase, time_now: int, serialized_event: JsonDict ) -> None: - """Potentially injects bundled aggregations into the unsigned portion of the serialized event. + """Potentially injects bundled relations into the unsigned portion of the serialized event. Args: event: The event being serialized. @@ -445,28 +435,20 @@ class EventClientSerializer: serialized_event: The serialized event which may be modified. """ - # Do not bundle aggregations for an event which represents an edit or an - # annotation. It does not make sense for them to have related events. - relates_to = event.content.get("m.relates_to") - if isinstance(relates_to, (dict, frozendict)): - relation_type = relates_to.get("rel_type") - if relation_type in (RelationTypes.ANNOTATION, RelationTypes.REPLACE): - return - event_id = event.event_id - # The bundled aggregations to include. - aggregations = {} + # The bundled relations to include. + relations = {} annotations = await self.store.get_aggregation_groups_for_event(event_id) if annotations.chunk: - aggregations[RelationTypes.ANNOTATION] = annotations.to_dict() + relations[RelationTypes.ANNOTATION] = annotations.to_dict() references = await self.store.get_relations_for_event( event_id, RelationTypes.REFERENCE, direction="f" ) if references.chunk: - aggregations[RelationTypes.REFERENCE] = references.to_dict() + relations[RelationTypes.REFERENCE] = references.to_dict() edit = None if event.type == EventTypes.Message: @@ -492,7 +474,7 @@ class EventClientSerializer: else: serialized_event["content"].pop("m.relates_to", None) - aggregations[RelationTypes.REPLACE] = { + relations[RelationTypes.REPLACE] = { "event_id": edit.event_id, "origin_server_ts": edit.origin_server_ts, "sender": edit.sender, @@ -505,19 +487,17 @@ class EventClientSerializer: latest_thread_event, ) = await self.store.get_thread_summary(event_id) if latest_thread_event: - aggregations[RelationTypes.THREAD] = { - # Don't bundle aggregations as this could recurse forever. + relations[RelationTypes.THREAD] = { + # Don't bundle relations as this could recurse forever. "latest_event": await self.serialize_event( - latest_thread_event, time_now, bundle_aggregations=False + latest_thread_event, time_now, bundle_relations=False ), "count": thread_count, } - # If any bundled aggregations were found, include them. - if aggregations: - serialized_event["unsigned"].setdefault("m.relations", {}).update( - aggregations - ) + # If any bundled relations were found, include them. + if relations: + serialized_event["unsigned"].setdefault("m.relations", {}).update(relations) async def serialize_events( self, events: Iterable[Union[JsonDict, EventBase]], time_now: int, **kwargs: Any |