Skip to content
Snippets Groups Projects
Unverified Commit eab59d75 authored by Patrick Cloke's avatar Patrick Cloke Committed by GitHub
Browse files

Convert the room handler to async/await. (#7396)

parent 032e5a2a
No related branches found
No related tags found
No related merge requests found
Convert the room handler to async/await.
...@@ -25,8 +25,6 @@ from collections import OrderedDict ...@@ -25,8 +25,6 @@ from collections import OrderedDict
from six import iteritems, string_types from six import iteritems, string_types
from twisted.internet import defer
from synapse.api.constants import EventTypes, JoinRules, RoomCreationPreset from synapse.api.constants import EventTypes, JoinRules, RoomCreationPreset
from synapse.api.errors import AuthError, Codes, NotFoundError, StoreError, SynapseError from synapse.api.errors import AuthError, Codes, NotFoundError, StoreError, SynapseError
from synapse.api.room_versions import KNOWN_ROOM_VERSIONS, RoomVersion from synapse.api.room_versions import KNOWN_ROOM_VERSIONS, RoomVersion
...@@ -103,8 +101,7 @@ class RoomCreationHandler(BaseHandler): ...@@ -103,8 +101,7 @@ class RoomCreationHandler(BaseHandler):
self.third_party_event_rules = hs.get_third_party_event_rules() self.third_party_event_rules = hs.get_third_party_event_rules()
@defer.inlineCallbacks async def upgrade_room(
def upgrade_room(
self, requester: Requester, old_room_id: str, new_version: RoomVersion self, requester: Requester, old_room_id: str, new_version: RoomVersion
): ):
"""Replace a room with a new room with a different version """Replace a room with a new room with a different version
...@@ -117,7 +114,7 @@ class RoomCreationHandler(BaseHandler): ...@@ -117,7 +114,7 @@ class RoomCreationHandler(BaseHandler):
Returns: Returns:
Deferred[unicode]: the new room id Deferred[unicode]: the new room id
""" """
yield self.ratelimit(requester) await self.ratelimit(requester)
user_id = requester.user.to_string() user_id = requester.user.to_string()
...@@ -138,7 +135,7 @@ class RoomCreationHandler(BaseHandler): ...@@ -138,7 +135,7 @@ class RoomCreationHandler(BaseHandler):
# If this user has sent multiple upgrade requests for the same room # If this user has sent multiple upgrade requests for the same room
# and one of them is not complete yet, cache the response and # and one of them is not complete yet, cache the response and
# return it to all subsequent requests # return it to all subsequent requests
ret = yield self._upgrade_response_cache.wrap( ret = await self._upgrade_response_cache.wrap(
(old_room_id, user_id), (old_room_id, user_id),
self._upgrade_room, self._upgrade_room,
requester, requester,
...@@ -856,8 +853,7 @@ class RoomCreationHandler(BaseHandler): ...@@ -856,8 +853,7 @@ class RoomCreationHandler(BaseHandler):
for (etype, state_key), content in initial_state.items(): for (etype, state_key), content in initial_state.items():
await send(etype=etype, state_key=state_key, content=content) await send(etype=etype, state_key=state_key, content=content)
@defer.inlineCallbacks async def _generate_room_id(
def _generate_room_id(
self, creator_id: str, is_public: str, room_version: RoomVersion, self, creator_id: str, is_public: str, room_version: RoomVersion,
): ):
# autogen room IDs and try to create it. We may clash, so just # autogen room IDs and try to create it. We may clash, so just
...@@ -869,7 +865,7 @@ class RoomCreationHandler(BaseHandler): ...@@ -869,7 +865,7 @@ class RoomCreationHandler(BaseHandler):
gen_room_id = RoomID(random_string, self.hs.hostname).to_string() gen_room_id = RoomID(random_string, self.hs.hostname).to_string()
if isinstance(gen_room_id, bytes): if isinstance(gen_room_id, bytes):
gen_room_id = gen_room_id.decode("utf-8") gen_room_id = gen_room_id.decode("utf-8")
yield self.store.store_room( await self.store.store_room(
room_id=gen_room_id, room_id=gen_room_id,
room_creator_user_id=creator_id, room_creator_user_id=creator_id,
is_public=is_public, is_public=is_public,
...@@ -888,8 +884,7 @@ class RoomContextHandler(object): ...@@ -888,8 +884,7 @@ class RoomContextHandler(object):
self.storage = hs.get_storage() self.storage = hs.get_storage()
self.state_store = self.storage.state self.state_store = self.storage.state
@defer.inlineCallbacks async def get_event_context(self, user, room_id, event_id, limit, event_filter):
def get_event_context(self, user, room_id, event_id, limit, event_filter):
"""Retrieves events, pagination tokens and state around a given event """Retrieves events, pagination tokens and state around a given event
in a room. in a room.
...@@ -908,7 +903,7 @@ class RoomContextHandler(object): ...@@ -908,7 +903,7 @@ class RoomContextHandler(object):
before_limit = math.floor(limit / 2.0) before_limit = math.floor(limit / 2.0)
after_limit = limit - before_limit after_limit = limit - before_limit
users = yield self.store.get_users_in_room(room_id) users = await self.store.get_users_in_room(room_id)
is_peeking = user.to_string() not in users is_peeking = user.to_string() not in users
def filter_evts(events): def filter_evts(events):
...@@ -916,17 +911,17 @@ class RoomContextHandler(object): ...@@ -916,17 +911,17 @@ class RoomContextHandler(object):
self.storage, user.to_string(), events, is_peeking=is_peeking self.storage, user.to_string(), events, is_peeking=is_peeking
) )
event = yield self.store.get_event( event = await self.store.get_event(
event_id, get_prev_content=True, allow_none=True event_id, get_prev_content=True, allow_none=True
) )
if not event: if not event:
return None return None
filtered = yield (filter_evts([event])) filtered = await filter_evts([event])
if not filtered: if not filtered:
raise AuthError(403, "You don't have permission to access that event.") raise AuthError(403, "You don't have permission to access that event.")
results = yield self.store.get_events_around( results = await self.store.get_events_around(
room_id, event_id, before_limit, after_limit, event_filter room_id, event_id, before_limit, after_limit, event_filter
) )
...@@ -934,8 +929,8 @@ class RoomContextHandler(object): ...@@ -934,8 +929,8 @@ class RoomContextHandler(object):
results["events_before"] = event_filter.filter(results["events_before"]) results["events_before"] = event_filter.filter(results["events_before"])
results["events_after"] = event_filter.filter(results["events_after"]) results["events_after"] = event_filter.filter(results["events_after"])
results["events_before"] = yield filter_evts(results["events_before"]) results["events_before"] = await filter_evts(results["events_before"])
results["events_after"] = yield filter_evts(results["events_after"]) results["events_after"] = await filter_evts(results["events_after"])
# filter_evts can return a pruned event in case the user is allowed to see that # filter_evts can return a pruned event in case the user is allowed to see that
# there's something there but not see the content, so use the event that's in # there's something there but not see the content, so use the event that's in
# `filtered` rather than the event we retrieved from the datastore. # `filtered` rather than the event we retrieved from the datastore.
...@@ -962,7 +957,7 @@ class RoomContextHandler(object): ...@@ -962,7 +957,7 @@ class RoomContextHandler(object):
# first? Shouldn't we be consistent with /sync? # first? Shouldn't we be consistent with /sync?
# https://github.com/matrix-org/matrix-doc/issues/687 # https://github.com/matrix-org/matrix-doc/issues/687
state = yield self.state_store.get_state_for_events( state = await self.state_store.get_state_for_events(
[last_event_id], state_filter=state_filter [last_event_id], state_filter=state_filter
) )
...@@ -970,7 +965,7 @@ class RoomContextHandler(object): ...@@ -970,7 +965,7 @@ class RoomContextHandler(object):
if event_filter: if event_filter:
state_events = event_filter.filter(state_events) state_events = event_filter.filter(state_events)
results["state"] = yield filter_evts(state_events) results["state"] = await filter_evts(state_events)
# We use a dummy token here as we only care about the room portion of # We use a dummy token here as we only care about the room portion of
# the token, which we replace. # the token, which we replace.
...@@ -989,13 +984,12 @@ class RoomEventSource(object): ...@@ -989,13 +984,12 @@ class RoomEventSource(object):
def __init__(self, hs): def __init__(self, hs):
self.store = hs.get_datastore() self.store = hs.get_datastore()
@defer.inlineCallbacks async def get_new_events(
def get_new_events(
self, user, from_key, limit, room_ids, is_guest, explicit_room_id=None self, user, from_key, limit, room_ids, is_guest, explicit_room_id=None
): ):
# We just ignore the key for now. # We just ignore the key for now.
to_key = yield self.get_current_key() to_key = await self.get_current_key()
from_token = RoomStreamToken.parse(from_key) from_token = RoomStreamToken.parse(from_key)
if from_token.topological: if from_token.topological:
...@@ -1008,11 +1002,11 @@ class RoomEventSource(object): ...@@ -1008,11 +1002,11 @@ class RoomEventSource(object):
# See https://github.com/matrix-org/matrix-doc/issues/1144 # See https://github.com/matrix-org/matrix-doc/issues/1144
raise NotImplementedError() raise NotImplementedError()
else: else:
room_events = yield self.store.get_membership_changes_for_user( room_events = await self.store.get_membership_changes_for_user(
user.to_string(), from_key, to_key user.to_string(), from_key, to_key
) )
room_to_events = yield self.store.get_room_events_stream_for_rooms( room_to_events = await self.store.get_room_events_stream_for_rooms(
room_ids=room_ids, room_ids=room_ids,
from_key=from_key, from_key=from_key,
to_key=to_key, to_key=to_key,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment