Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit 323151b

Browse files
authored
Convert EventStreamResult to attrs. (#11574)
1 parent 17886d2 commit 323151b

File tree

3 files changed

+24
-9
lines changed

3 files changed

+24
-9
lines changed

changelog.d/11574.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Convert `EventStreamResult` from a `namedtuple` to `attrs` to improve type hints.

synapse/handlers/events.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,14 @@ async def get_stream(
7979
# thundering herds on restart.
8080
timeout = random.randint(int(timeout * 0.9), int(timeout * 1.1))
8181

82-
events, tokens = await self.notifier.get_events_for(
82+
stream_result = await self.notifier.get_events_for(
8383
auth_user,
8484
pagin_config,
8585
timeout,
8686
is_guest=is_guest,
8787
explicit_room_id=room_id,
8888
)
89+
events = stream_result.events
8990

9091
time_now = self.clock.time_msec()
9192

@@ -128,8 +129,8 @@ async def get_stream(
128129

129130
chunk = {
130131
"chunk": chunks,
131-
"start": await tokens[0].to_string(self.store),
132-
"end": await tokens[1].to_string(self.store),
132+
"start": await stream_result.start_token.to_string(self.store),
133+
"end": await stream_result.end_token.to_string(self.store),
133134
}
134135

135136
return chunk

synapse/notifier.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
# limitations under the License.
1414

1515
import logging
16-
from collections import namedtuple
1716
from typing import (
1817
Awaitable,
1918
Callable,
@@ -44,7 +43,13 @@
4443
from synapse.logging.utils import log_function
4544
from synapse.metrics import LaterGauge
4645
from synapse.streams.config import PaginationConfig
47-
from synapse.types import PersistedEventPosition, RoomStreamToken, StreamToken, UserID
46+
from synapse.types import (
47+
JsonDict,
48+
PersistedEventPosition,
49+
RoomStreamToken,
50+
StreamToken,
51+
UserID,
52+
)
4853
from synapse.util.async_helpers import ObservableDeferred, timeout_deferred
4954
from synapse.util.metrics import Measure
5055
from synapse.visibility import filter_events_for_client
@@ -178,7 +183,12 @@ def new_listener(self, token: StreamToken) -> _NotificationListener:
178183
return _NotificationListener(self.notify_deferred.observe())
179184

180185

181-
class EventStreamResult(namedtuple("EventStreamResult", ("events", "tokens"))):
186+
@attr.s(slots=True, frozen=True, auto_attribs=True)
187+
class EventStreamResult:
188+
events: List[Union[JsonDict, EventBase]]
189+
start_token: StreamToken
190+
end_token: StreamToken
191+
182192
def __bool__(self):
183193
return bool(self.events)
184194

@@ -582,9 +592,12 @@ async def check_for_updates(
582592
before_token: StreamToken, after_token: StreamToken
583593
) -> EventStreamResult:
584594
if after_token == before_token:
585-
return EventStreamResult([], (from_token, from_token))
595+
return EventStreamResult([], from_token, from_token)
586596

587-
events: List[EventBase] = []
597+
# The events fetched from each source are a JsonDict, EventBase, or
598+
# UserPresenceState, but see below for UserPresenceState being
599+
# converted to JsonDict.
600+
events: List[Union[JsonDict, EventBase]] = []
588601
end_token = from_token
589602

590603
for name, source in self.event_sources.sources.get_sources():
@@ -623,7 +636,7 @@ async def check_for_updates(
623636
events.extend(new_events)
624637
end_token = end_token.copy_and_replace(keyname, new_key)
625638

626-
return EventStreamResult(events, (from_token, end_token))
639+
return EventStreamResult(events, from_token, end_token)
627640

628641
user_id_for_stream = user.to_string()
629642
if is_peeking:

0 commit comments

Comments
 (0)