@@ -57,6 +57,9 @@ class EventContext:
5757 If ``state_group`` is None (ie, the event is an outlier),
5858 ``state_group_before_event`` will always also be ``None``.
5959
60+ delta_before_after: If `state_group` and `state_group_before_event` are not None
61+ then this is the delta of the state between the two groups.
62+
6063 prev_group: If it is known, ``state_group``'s prev_group. Note that this being
6164 None does not necessarily mean that ``state_group`` does not have
6265 a prev_group!
@@ -75,30 +78,6 @@ class EventContext:
7578 app_service: If this event is being sent by a (local) application service, that
7679 app service.
7780
78- _current_state_ids: The room state map, including this event - ie, the state
79- in ``state_group``.
80-
81- (type, state_key) -> event_id
82-
83- For an outlier, this is {}
84-
85- Note that this is a private attribute: it should be accessed via
86- ``get_current_state_ids``. _AsyncEventContext impl calculates this
87- on-demand: it will be None until that happens.
88-
89- _prev_state_ids: The room state map, excluding this event - ie, the state
90- in ``state_group_before_event``. For a non-state
91- event, this will be the same as _current_state_events.
92-
93- Note that it is a completely different thing to prev_group!
94-
95- (type, state_key) -> event_id
96-
97- For an outlier, this is {}
98-
99- As with _current_state_ids, this is a private attribute. It should be
100- accessed via get_prev_state_ids.
101-
10281 partial_state: if True, we may be storing this event with a temporary,
10382 incomplete state.
10483 """
@@ -107,22 +86,19 @@ class EventContext:
10786 rejected : Union [bool , str ] = False
10887 _state_group : Optional [int ] = None
10988 state_group_before_event : Optional [int ] = None
89+ _delta_before_after : Optional [StateMap [str ]] = None
11090 prev_group : Optional [int ] = None
11191 delta_ids : Optional [StateMap [str ]] = None
11292 app_service : Optional [ApplicationService ] = None
11393
114- _current_state_ids : Optional [StateMap [str ]] = None
115- _prev_state_ids : Optional [StateMap [str ]] = None
116-
11794 partial_state : bool = False
11895
11996 @staticmethod
12097 def with_state (
12198 storage : "Storage" ,
12299 state_group : Optional [int ],
123100 state_group_before_event : Optional [int ],
124- current_state_ids : Optional [StateMap [str ]],
125- prev_state_ids : Optional [StateMap [str ]],
101+ delta_before_after : Optional [StateMap [str ]],
126102 partial_state : bool ,
127103 prev_group : Optional [int ] = None ,
128104 delta_ids : Optional [StateMap [str ]] = None ,
@@ -131,6 +107,7 @@ def with_state(
131107 storage = storage ,
132108 state_group = state_group ,
133109 state_group_before_event = state_group_before_event ,
110+ delta_before_after = delta_before_after ,
134111 prev_group = prev_group ,
135112 delta_ids = delta_ids ,
136113 partial_state = partial_state ,
@@ -141,11 +118,7 @@ def for_outlier(
141118 storage : "Storage" ,
142119 ) -> "EventContext" :
143120 """Return an EventContext instance suitable for persisting an outlier event"""
144- return EventContext (
145- storage = storage ,
146- current_state_ids = {},
147- prev_state_ids = {},
148- )
121+ return EventContext (storage = storage )
149122
150123 async def serialize (self , event : EventBase , store : "DataStore" ) -> JsonDict :
151124 """Converts self to a type that can be serialized as JSON, and then
@@ -163,6 +136,7 @@ async def serialize(self, event: EventBase, store: "DataStore") -> JsonDict:
163136 "state_group_before_event" : self .state_group_before_event ,
164137 "rejected" : self .rejected ,
165138 "prev_group" : self .prev_group ,
139+ "delta_before_after" : _encode_state_dict (self ._delta_before_after ),
166140 "delta_ids" : _encode_state_dict (self .delta_ids ),
167141 "app_service_id" : self .app_service .id if self .app_service else None ,
168142 "partial_state" : self .partial_state ,
@@ -187,6 +161,7 @@ def deserialize(storage: "Storage", input: JsonDict) -> "EventContext":
187161 state_group = input ["state_group" ],
188162 state_group_before_event = input ["state_group_before_event" ],
189163 prev_group = input ["prev_group" ],
164+ delta_before_after = _decode_state_dict (input ["delta_before_after" ]),
190165 delta_ids = _decode_state_dict (input ["delta_ids" ]),
191166 rejected = input ["rejected" ],
192167 partial_state = input .get ("partial_state" , False ),
@@ -234,10 +209,15 @@ async def get_current_state_ids(self) -> Optional[StateMap[str]]:
234209 if self .rejected :
235210 raise RuntimeError ("Attempt to access state_ids of rejected event" )
236211
237- if self ._state_group is None :
238- return None
212+ assert self ._delta_before_after is not None
213+
214+ prev_state_ids = await self .get_prev_state_ids ()
215+
216+ if self ._delta_before_after :
217+ prev_state_ids = dict (prev_state_ids )
218+ prev_state_ids .update (self ._delta_before_after )
239219
240- return await self . _storage . state . get_state_ids_for_group ( self . _state_group )
220+ return prev_state_ids
241221
242222 async def get_prev_state_ids (self ) -> StateMap [str ]:
243223 """
@@ -252,7 +232,7 @@ async def get_prev_state_ids(self) -> StateMap[str]:
252232 Maps a (type, state_key) to the event ID of the state event matching
253233 this tuple.
254234 """
255- assert self .state_group_before_event
235+ assert self .state_group_before_event is not None
256236 return await self ._storage .state .get_state_ids_for_group (
257237 self .state_group_before_event
258238 )
0 commit comments