diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py
index 2823ca6f0d..b49b917b6e 100644
--- a/synapse/handlers/room.py
+++ b/synapse/handlers/room.py
@@ -1,16 +1,22 @@
-# Copyright 2016-2021 The Matrix.org Foundation C.I.C.
#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
+# This file is licensed under the Affero General Public License (AGPL) version 3.
+#
+# Copyright (C) 2023 New Vector, Ltd
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# See the GNU Affero General Public License for more details:
+# <https://www.gnu.org/licenses/agpl-3.0.html>.
+#
+# Originally licensed under the Apache License, Version 2.0:
+# <http://www.apache.org/licenses/LICENSE-2.0>.
+#
+# [This file includes modifications made by New Vector Limited]
#
-# http://www.apache.org/licenses/LICENSE-2.0
#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
"""Contains functions for performing actions on rooms."""
import itertools
@@ -20,7 +26,17 @@ import random
import string
from collections import OrderedDict
from http import HTTPStatus
-from typing import TYPE_CHECKING, Any, Awaitable, Callable, Dict, List, Optional, Tuple
+from typing import (
+ TYPE_CHECKING,
+ Any,
+ Awaitable,
+ Callable,
+ Dict,
+ List,
+ Optional,
+ Tuple,
+ cast,
+)
import attr
from typing_extensions import TypedDict
@@ -1736,13 +1752,19 @@ class RoomEventSource(EventSource[RoomStreamToken, EventBase]):
events = list(room_events)
events.extend(e for evs, _ in room_to_events.values() for e in evs)
- events.sort(key=lambda e: e.internal_metadata.order)
+ # We know stream_ordering must be not None here, as its been
+ # persisted, but mypy doesn't know that
+ events.sort(key=lambda e: cast(int, e.internal_metadata.stream_ordering))
if limit:
events[:] = events[:limit]
if events:
- end_key = events[-1].internal_metadata.after
+ last_event = events[-1]
+ assert last_event.internal_metadata.stream_ordering
+ end_key = RoomStreamToken(
+ stream=last_event.internal_metadata.stream_ordering,
+ )
else:
end_key = to_key
|