Move static knowledge of protocol metadata into AS handler; cache the result

This commit is contained in:
Paul "LeoNerd" Evans 2016-08-24 13:01:53 +01:00
parent 965f33c901
commit 8e1ed09dff
2 changed files with 25 additions and 22 deletions

View File

@ -37,6 +37,13 @@ def log_failure(failure):
class ApplicationServicesHandler(object): class ApplicationServicesHandler(object):
PROTOCOL_META = {
# TODO(paul): Declare kinds of metadata in here
"gitter": {
"user_fields": ["username"],
}
}
def __init__(self, hs): def __init__(self, hs):
self.store = hs.get_datastore() self.store = hs.get_datastore()
self.is_mine_id = hs.is_mine_id self.is_mine_id = hs.is_mine_id
@ -48,6 +55,7 @@ class ApplicationServicesHandler(object):
self.current_max = 0 self.current_max = 0
self.is_processing = False self.is_processing = False
self.supported_protocols = None
@defer.inlineCallbacks @defer.inlineCallbacks
def notify_interested_services(self, current_id): def notify_interested_services(self, current_id):
@ -177,10 +185,24 @@ class ApplicationServicesHandler(object):
@defer.inlineCallbacks @defer.inlineCallbacks
def get_3pe_protocols(self): def get_3pe_protocols(self):
# The set of supported AS protocols and the metadata about them is
# effectively static during the lifetime of a homeserver process. We
# can look this up once and just cache it.
if self.supported_protocols:
defer.returnValue(self.supported_protocols)
services = yield self.store.get_app_services() services = yield self.store.get_app_services()
protocols = set() protocols = {}
for s in services: for s in services:
protocols.update(s.protocols) for p in s.protocols:
if p in self.PROTOCOL_META:
protocols[p] = self.PROTOCOL_META[p]
else:
# We don't know any metadata for it, but we'd best at least
# still declare that we know it exists
protocols[p] = {}
self.supported_protocols = protocols
defer.returnValue(protocols) defer.returnValue(protocols)
@defer.inlineCallbacks @defer.inlineCallbacks

View File

@ -28,13 +28,6 @@ logger = logging.getLogger(__name__)
class ThirdPartyProtocolsServlet(RestServlet): class ThirdPartyProtocolsServlet(RestServlet):
PATTERNS = client_v2_patterns("/thirdparty/protocols", releases=()) PATTERNS = client_v2_patterns("/thirdparty/protocols", releases=())
META = {
# TODO(paul): Declare kinds of metadata in here
"gitter": {
"user_fields": ["username"],
}
}
def __init__(self, hs): def __init__(self, hs):
super(ThirdPartyProtocolsServlet, self).__init__() super(ThirdPartyProtocolsServlet, self).__init__()
@ -46,19 +39,7 @@ class ThirdPartyProtocolsServlet(RestServlet):
yield self.auth.get_user_by_req(request) yield self.auth.get_user_by_req(request)
protocols = yield self.appservice_handler.get_3pe_protocols() protocols = yield self.appservice_handler.get_3pe_protocols()
defer.returnValue((200, protocols))
result = {}
# TODO(paul): Eventually this kind of metadata wants to come from the
# ASes themselves
for protocol in protocols:
if protocol in self.META:
result[protocol] = self.META[protocol]
else:
# We don't know any metadata for it, but we'd best at least
# still declare that we know it exists
result[protocol] = {}
defer.returnValue((200, result))
class ThirdPartyUserServlet(RestServlet): class ThirdPartyUserServlet(RestServlet):