Convert the typing handler to async/await. (#7679)

pull/7725/head
Patrick Cloke 2020-06-17 10:37:59 -04:00 committed by GitHub
parent 96bc110a68
commit 3630825612
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 24 deletions

1
changelog.d/7679.misc Normal file
View File

@ -0,0 +1 @@
Convert typing handler to async/await.

View File

@ -17,8 +17,6 @@ import logging
from collections import namedtuple from collections import namedtuple
from typing import List, Tuple from typing import List, Tuple
from twisted.internet import defer
from synapse.api.errors import AuthError, SynapseError from synapse.api.errors import AuthError, SynapseError
from synapse.logging.context import run_in_background from synapse.logging.context import run_in_background
from synapse.types import UserID, get_domain_from_id from synapse.types import UserID, get_domain_from_id
@ -115,8 +113,7 @@ class TypingHandler(object):
def is_typing(self, member): def is_typing(self, member):
return member.user_id in self._room_typing.get(member.room_id, []) return member.user_id in self._room_typing.get(member.room_id, [])
@defer.inlineCallbacks async def started_typing(self, target_user, auth_user, room_id, timeout):
def started_typing(self, target_user, auth_user, room_id, timeout):
target_user_id = target_user.to_string() target_user_id = target_user.to_string()
auth_user_id = auth_user.to_string() auth_user_id = auth_user.to_string()
@ -126,7 +123,7 @@ class TypingHandler(object):
if target_user_id != auth_user_id: if target_user_id != auth_user_id:
raise AuthError(400, "Cannot set another user's typing state") raise AuthError(400, "Cannot set another user's typing state")
yield self.auth.check_user_in_room(room_id, target_user_id) await self.auth.check_user_in_room(room_id, target_user_id)
logger.debug("%s has started typing in %s", target_user_id, room_id) logger.debug("%s has started typing in %s", target_user_id, room_id)
@ -145,8 +142,7 @@ class TypingHandler(object):
self._push_update(member=member, typing=True) self._push_update(member=member, typing=True)
@defer.inlineCallbacks async def stopped_typing(self, target_user, auth_user, room_id):
def stopped_typing(self, target_user, auth_user, room_id):
target_user_id = target_user.to_string() target_user_id = target_user.to_string()
auth_user_id = auth_user.to_string() auth_user_id = auth_user.to_string()
@ -156,7 +152,7 @@ class TypingHandler(object):
if target_user_id != auth_user_id: if target_user_id != auth_user_id:
raise AuthError(400, "Cannot set another user's typing state") raise AuthError(400, "Cannot set another user's typing state")
yield self.auth.check_user_in_room(room_id, target_user_id) await self.auth.check_user_in_room(room_id, target_user_id)
logger.debug("%s has stopped typing in %s", target_user_id, room_id) logger.debug("%s has stopped typing in %s", target_user_id, room_id)
@ -164,12 +160,11 @@ class TypingHandler(object):
self._stopped_typing(member) self._stopped_typing(member)
@defer.inlineCallbacks
def user_left_room(self, user, room_id): def user_left_room(self, user, room_id):
user_id = user.to_string() user_id = user.to_string()
if self.is_mine_id(user_id): if self.is_mine_id(user_id):
member = RoomMember(room_id=room_id, user_id=user_id) member = RoomMember(room_id=room_id, user_id=user_id)
yield self._stopped_typing(member) self._stopped_typing(member)
def _stopped_typing(self, member): def _stopped_typing(self, member):
if member.user_id not in self._room_typing.get(member.room_id, set()): if member.user_id not in self._room_typing.get(member.room_id, set()):
@ -188,10 +183,9 @@ class TypingHandler(object):
self._push_update_local(member=member, typing=typing) self._push_update_local(member=member, typing=typing)
@defer.inlineCallbacks async def _push_remote(self, member, typing):
def _push_remote(self, member, typing):
try: try:
users = yield self.state.get_current_users_in_room(member.room_id) users = await self.state.get_current_users_in_room(member.room_id)
self._member_last_federation_poke[member] = self.clock.time_msec() self._member_last_federation_poke[member] = self.clock.time_msec()
now = self.clock.time_msec() now = self.clock.time_msec()
@ -215,8 +209,7 @@ class TypingHandler(object):
except Exception: except Exception:
logger.exception("Error pushing typing notif to remotes") logger.exception("Error pushing typing notif to remotes")
@defer.inlineCallbacks async def _recv_edu(self, origin, content):
def _recv_edu(self, origin, content):
room_id = content["room_id"] room_id = content["room_id"]
user_id = content["user_id"] user_id = content["user_id"]
@ -231,7 +224,7 @@ class TypingHandler(object):
) )
return return
users = yield self.state.get_current_users_in_room(room_id) users = await self.state.get_current_users_in_room(room_id)
domains = {get_domain_from_id(u) for u in users} domains = {get_domain_from_id(u) for u in users}
if self.server_name in domains: if self.server_name in domains:
@ -330,7 +323,7 @@ class TypingNotificationEventSource(object):
"content": {"user_ids": list(typing)}, "content": {"user_ids": list(typing)},
} }
def get_new_events(self, from_key, room_ids, **kwargs): async def get_new_events(self, from_key, room_ids, **kwargs):
with Measure(self.clock, "typing.get_new_events"): with Measure(self.clock, "typing.get_new_events"):
from_key = int(from_key) from_key = int(from_key)
handler = self.get_typing_handler() handler = self.get_typing_handler()
@ -344,7 +337,7 @@ class TypingNotificationEventSource(object):
events.append(self._make_event_for(room_id)) events.append(self._make_event_for(room_id))
return defer.succeed((events, handler._latest_room_serial)) return (events, handler._latest_room_serial)
def get_current_key(self): def get_current_key(self):
return self.get_typing_handler()._latest_room_serial return self.get_typing_handler()._latest_room_serial

View File

@ -129,6 +129,7 @@ class TypingNotificationsTestCase(unittest.HomeserverTestCase):
def check_user_in_room(room_id, user_id): def check_user_in_room(room_id, user_id):
if user_id not in [u.to_string() for u in self.room_members]: if user_id not in [u.to_string() for u in self.room_members]:
raise AuthError(401, "User is not in the room") raise AuthError(401, "User is not in the room")
return defer.succeed(None)
hs.get_auth().check_user_in_room = check_user_in_room hs.get_auth().check_user_in_room = check_user_in_room
@ -138,7 +139,7 @@ class TypingNotificationsTestCase(unittest.HomeserverTestCase):
self.datastore.get_joined_hosts_for_room = get_joined_hosts_for_room self.datastore.get_joined_hosts_for_room = get_joined_hosts_for_room
def get_current_users_in_room(room_id): def get_current_users_in_room(room_id):
return {str(u) for u in self.room_members} return defer.succeed({str(u) for u in self.room_members})
hs.get_state_handler().get_current_users_in_room = get_current_users_in_room hs.get_state_handler().get_current_users_in_room = get_current_users_in_room
@ -163,7 +164,7 @@ class TypingNotificationsTestCase(unittest.HomeserverTestCase):
self.assertEquals(self.event_source.get_current_key(), 0) self.assertEquals(self.event_source.get_current_key(), 0)
self.successResultOf( self.get_success(
self.handler.started_typing( self.handler.started_typing(
target_user=U_APPLE, auth_user=U_APPLE, room_id=ROOM_ID, timeout=20000 target_user=U_APPLE, auth_user=U_APPLE, room_id=ROOM_ID, timeout=20000
) )
@ -190,7 +191,7 @@ class TypingNotificationsTestCase(unittest.HomeserverTestCase):
def test_started_typing_remote_send(self): def test_started_typing_remote_send(self):
self.room_members = [U_APPLE, U_ONION] self.room_members = [U_APPLE, U_ONION]
self.successResultOf( self.get_success(
self.handler.started_typing( self.handler.started_typing(
target_user=U_APPLE, auth_user=U_APPLE, room_id=ROOM_ID, timeout=20000 target_user=U_APPLE, auth_user=U_APPLE, room_id=ROOM_ID, timeout=20000
) )
@ -265,7 +266,7 @@ class TypingNotificationsTestCase(unittest.HomeserverTestCase):
self.assertEquals(self.event_source.get_current_key(), 0) self.assertEquals(self.event_source.get_current_key(), 0)
self.successResultOf( self.get_success(
self.handler.stopped_typing( self.handler.stopped_typing(
target_user=U_APPLE, auth_user=U_APPLE, room_id=ROOM_ID target_user=U_APPLE, auth_user=U_APPLE, room_id=ROOM_ID
) )
@ -305,7 +306,7 @@ class TypingNotificationsTestCase(unittest.HomeserverTestCase):
self.assertEquals(self.event_source.get_current_key(), 0) self.assertEquals(self.event_source.get_current_key(), 0)
self.successResultOf( self.get_success(
self.handler.started_typing( self.handler.started_typing(
target_user=U_APPLE, auth_user=U_APPLE, room_id=ROOM_ID, timeout=10000 target_user=U_APPLE, auth_user=U_APPLE, room_id=ROOM_ID, timeout=10000
) )
@ -344,7 +345,7 @@ class TypingNotificationsTestCase(unittest.HomeserverTestCase):
# SYN-230 - see if we can still set after timeout # SYN-230 - see if we can still set after timeout
self.successResultOf( self.get_success(
self.handler.started_typing( self.handler.started_typing(
target_user=U_APPLE, auth_user=U_APPLE, room_id=ROOM_ID, timeout=10000 target_user=U_APPLE, auth_user=U_APPLE, room_id=ROOM_ID, timeout=10000
) )