Move typing handler out of the Handlers object

This commit is contained in:
Mark Haines 2016-05-17 15:58:46 +01:00
parent 5adf627551
commit 0cb441fedd
8 changed files with 27 additions and 36 deletions

View File

@ -25,7 +25,6 @@ from .events import EventStreamHandler, EventHandler
from .federation import FederationHandler from .federation import FederationHandler
from .profile import ProfileHandler from .profile import ProfileHandler
from .directory import DirectoryHandler from .directory import DirectoryHandler
from .typing import TypingNotificationHandler
from .admin import AdminHandler from .admin import AdminHandler
from .appservice import ApplicationServicesHandler from .appservice import ApplicationServicesHandler
from .auth import AuthHandler from .auth import AuthHandler
@ -53,7 +52,6 @@ class Handlers(object):
self.profile_handler = ProfileHandler(hs) self.profile_handler = ProfileHandler(hs)
self.room_list_handler = RoomListHandler(hs) self.room_list_handler = RoomListHandler(hs)
self.directory_handler = DirectoryHandler(hs) self.directory_handler = DirectoryHandler(hs)
self.typing_notification_handler = TypingNotificationHandler(hs)
self.admin_handler = AdminHandler(hs) self.admin_handler = AdminHandler(hs)
self.receipts_handler = ReceiptsHandler(hs) self.receipts_handler = ReceiptsHandler(hs)
asapi = ApplicationServiceApi(hs) asapi = ApplicationServiceApi(hs)

View File

@ -15,8 +15,6 @@
from twisted.internet import defer from twisted.internet import defer
from ._base import BaseHandler
from synapse.api.errors import SynapseError, AuthError from synapse.api.errors import SynapseError, AuthError
from synapse.util.logcontext import PreserveLoggingContext from synapse.util.logcontext import PreserveLoggingContext
from synapse.util.metrics import Measure from synapse.util.metrics import Measure
@ -35,12 +33,13 @@ logger = logging.getLogger(__name__)
RoomMember = namedtuple("RoomMember", ("room_id", "user")) RoomMember = namedtuple("RoomMember", ("room_id", "user"))
class TypingNotificationHandler(BaseHandler): class TypingHandler(object):
def __init__(self, hs): def __init__(self, hs):
super(TypingNotificationHandler, self).__init__(hs)
self.store = hs.get_datastore() self.store = hs.get_datastore()
self.server_name = hs.config.server_name self.server_name = hs.config.server_name
self.auth = hs.get_auth()
self.is_mine = hs.is_mine
self.notifier = hs.get_notifier()
self.clock = hs.get_clock() self.clock = hs.get_clock()
@ -68,7 +67,7 @@ class TypingNotificationHandler(BaseHandler):
@defer.inlineCallbacks @defer.inlineCallbacks
def started_typing(self, target_user, auth_user, room_id, timeout): def started_typing(self, target_user, auth_user, room_id, timeout):
if not self.hs.is_mine(target_user): if not self.is_mine(target_user):
raise SynapseError(400, "User is not hosted on this Home Server") raise SynapseError(400, "User is not hosted on this Home Server")
if target_user != auth_user: if target_user != auth_user:
@ -111,7 +110,7 @@ class TypingNotificationHandler(BaseHandler):
@defer.inlineCallbacks @defer.inlineCallbacks
def stopped_typing(self, target_user, auth_user, room_id): def stopped_typing(self, target_user, auth_user, room_id):
if not self.hs.is_mine(target_user): if not self.is_mine(target_user):
raise SynapseError(400, "User is not hosted on this Home Server") raise SynapseError(400, "User is not hosted on this Home Server")
if target_user != auth_user: if target_user != auth_user:
@ -133,7 +132,7 @@ class TypingNotificationHandler(BaseHandler):
@defer.inlineCallbacks @defer.inlineCallbacks
def user_left_room(self, user, room_id): def user_left_room(self, user, room_id):
if self.hs.is_mine(user): if self.is_mine(user):
member = RoomMember(room_id=room_id, user=user) member = RoomMember(room_id=room_id, user=user)
yield self._stopped_typing(member) yield self._stopped_typing(member)
@ -228,16 +227,14 @@ class TypingNotificationEventSource(object):
def __init__(self, hs): def __init__(self, hs):
self.hs = hs self.hs = hs
self.clock = hs.get_clock() self.clock = hs.get_clock()
self._handler = None # We can't call get_typing_handler here because there's a cycle:
#
def handler(self): # Typing -> Notifier -> TypingNotificationEventSource -> Typing
# Avoid cyclic dependency in handler setup #
if not self._handler: self.get_typing_handler = hs.get_typing_handler
self._handler = self.hs.get_handlers().typing_notification_handler
return self._handler
def _make_event_for(self, room_id): def _make_event_for(self, room_id):
typing = self.handler()._room_typing[room_id] typing = self.get_typing_handler()._room_typing[room_id]
return { return {
"type": "m.typing", "type": "m.typing",
"room_id": room_id, "room_id": room_id,
@ -249,7 +246,7 @@ class TypingNotificationEventSource(object):
def get_new_events(self, from_key, room_ids, **kwargs): 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.handler() handler = self.get_typing_handler()
events = [] events = []
for room_id in room_ids: for room_id in room_ids:
@ -263,7 +260,7 @@ class TypingNotificationEventSource(object):
return events, handler._latest_room_serial return events, handler._latest_room_serial
def get_current_key(self): def get_current_key(self):
return self.handler()._latest_room_serial return self.get_typing_handler()._latest_room_serial
def get_pagination_rows(self, user, pagination_config, key): def get_pagination_rows(self, user, pagination_config, key):
return ([], pagination_config.from_key) return ([], pagination_config.from_key)

View File

@ -110,7 +110,7 @@ class ReplicationResource(Resource):
self.store = hs.get_datastore() self.store = hs.get_datastore()
self.sources = hs.get_event_sources() self.sources = hs.get_event_sources()
self.presence_handler = hs.get_presence_handler() self.presence_handler = hs.get_presence_handler()
self.typing_handler = hs.get_handlers().typing_notification_handler self.typing_handler = hs.get_typing_handler()
self.notifier = hs.notifier self.notifier = hs.notifier
self.clock = hs.get_clock() self.clock = hs.get_clock()

View File

@ -571,6 +571,7 @@ class RoomTypingRestServlet(ClientV1RestServlet):
def __init__(self, hs): def __init__(self, hs):
super(RoomTypingRestServlet, self).__init__(hs) super(RoomTypingRestServlet, self).__init__(hs)
self.presence_handler = hs.get_presence_handler() self.presence_handler = hs.get_presence_handler()
self.typing_handler = hs.get_typing_handler()
@defer.inlineCallbacks @defer.inlineCallbacks
def on_PUT(self, request, room_id, user_id): def on_PUT(self, request, room_id, user_id):
@ -581,19 +582,17 @@ class RoomTypingRestServlet(ClientV1RestServlet):
content = parse_json_object_from_request(request) content = parse_json_object_from_request(request)
typing_handler = self.handlers.typing_notification_handler
yield self.presence_handler.bump_presence_active_time(requester.user) yield self.presence_handler.bump_presence_active_time(requester.user)
if content["typing"]: if content["typing"]:
yield typing_handler.started_typing( yield self.typing_handler.started_typing(
target_user=target_user, target_user=target_user,
auth_user=requester.user, auth_user=requester.user,
room_id=room_id, room_id=room_id,
timeout=content.get("timeout", 30000), timeout=content.get("timeout", 30000),
) )
else: else:
yield typing_handler.stopped_typing( yield self.typing_handler.stopped_typing(
target_user=target_user, target_user=target_user,
auth_user=requester.user, auth_user=requester.user,
room_id=room_id, room_id=room_id,

View File

@ -29,6 +29,7 @@ from synapse.api.auth import Auth
from synapse.handlers import Handlers from synapse.handlers import Handlers
from synapse.handlers.presence import PresenceHandler from synapse.handlers.presence import PresenceHandler
from synapse.handlers.sync import SyncHandler from synapse.handlers.sync import SyncHandler
from synapse.handlers.typing import TypingHandler
from synapse.state import StateHandler from synapse.state import StateHandler
from synapse.storage import DataStore from synapse.storage import DataStore
from synapse.util import Clock from synapse.util import Clock
@ -82,6 +83,7 @@ class HomeServer(object):
'state_handler', 'state_handler',
'presence_handler', 'presence_handler',
'sync_handler', 'sync_handler',
'typing_handler',
'notifier', 'notifier',
'distributor', 'distributor',
'client_resource', 'client_resource',
@ -171,6 +173,9 @@ class HomeServer(object):
def build_presence_handler(self): def build_presence_handler(self):
return PresenceHandler(self) return PresenceHandler(self)
def build_typing_handler(self):
return TypingHandler(self)
def build_sync_handler(self): def build_sync_handler(self):
return SyncHandler(self) return SyncHandler(self)

View File

@ -25,8 +25,6 @@ from ..utils import (
) )
from synapse.api.errors import AuthError from synapse.api.errors import AuthError
from synapse.handlers.typing import TypingNotificationHandler
from synapse.types import UserID from synapse.types import UserID
@ -49,11 +47,6 @@ def _make_edu_json(origin, edu_type, content):
return json.dumps(_expect_edu("test", edu_type, content, origin=origin)) return json.dumps(_expect_edu("test", edu_type, content, origin=origin))
class JustTypingNotificationHandlers(object):
def __init__(self, hs):
self.typing_notification_handler = TypingNotificationHandler(hs)
class TypingNotificationsTestCase(unittest.TestCase): class TypingNotificationsTestCase(unittest.TestCase):
"""Tests typing notifications to rooms.""" """Tests typing notifications to rooms."""
@defer.inlineCallbacks @defer.inlineCallbacks
@ -89,9 +82,8 @@ class TypingNotificationsTestCase(unittest.TestCase):
http_client=self.mock_http_client, http_client=self.mock_http_client,
keyring=Mock(), keyring=Mock(),
) )
hs.handlers = JustTypingNotificationHandlers(hs)
self.handler = hs.get_handlers().typing_notification_handler self.handler = hs.get_typing_handler()
self.event_source = hs.get_event_sources().sources["typing"] self.event_source = hs.get_event_sources().sources["typing"]

View File

@ -93,7 +93,7 @@ class ReplicationResourceCase(unittest.TestCase):
def test_typing(self): def test_typing(self):
room_id = yield self.create_room() room_id = yield self.create_room()
get = self.get(typing="-1") get = self.get(typing="-1")
yield self.hs.get_handlers().typing_notification_handler.started_typing( yield self.hs.get_typing_handler().started_typing(
self.user, self.user, room_id, timeout=2 self.user, self.user, room_id, timeout=2
) )
code, body = yield get code, body = yield get

View File

@ -106,7 +106,7 @@ class RoomTypingTestCase(RestTestCase):
yield self.join(self.room_id, user="@jim:red") yield self.join(self.room_id, user="@jim:red")
def tearDown(self): def tearDown(self):
self.hs.get_handlers().typing_notification_handler.tearDown() self.hs.get_typing_handler().tearDown()
@defer.inlineCallbacks @defer.inlineCallbacks
def test_set_typing(self): def test_set_typing(self):