lazyload aware /messages (#3589)

pull/3705/head
Matthew Hodgson 2018-08-16 15:22:47 +02:00 committed by Richard van der Hoff
parent 3f543dc021
commit 762a758fea
3 changed files with 47 additions and 2 deletions

1
changelog.d/3589.feature Normal file
View File

@ -0,0 +1 @@
Add lazy-loading support to /messages as per MSC1227

View File

@ -18,7 +18,7 @@ import logging
from twisted.internet import defer from twisted.internet import defer
from twisted.python.failure import Failure from twisted.python.failure import Failure
from synapse.api.constants import Membership from synapse.api.constants import EventTypes, Membership
from synapse.api.errors import SynapseError from synapse.api.errors import SynapseError
from synapse.events.utils import serialize_event from synapse.events.utils import serialize_event
from synapse.types import RoomStreamToken from synapse.types import RoomStreamToken
@ -251,6 +251,33 @@ class PaginationHandler(object):
is_peeking=(member_event_id is None), is_peeking=(member_event_id is None),
) )
state = None
if event_filter and event_filter.lazy_load_members():
# TODO: remove redundant members
types = [
(EventTypes.Member, state_key)
for state_key in set(
event.sender # FIXME: we also care about invite targets etc.
for event in events
)
]
state_ids = yield self.store.get_state_ids_for_event(
events[0].event_id, types=types,
)
if state_ids:
state = yield self.store.get_events(list(state_ids.values()))
if state:
state = yield filter_events_for_client(
self.store,
user_id,
state.values(),
is_peeking=(member_event_id is None),
)
time_now = self.clock.time_msec() time_now = self.clock.time_msec()
chunk = { chunk = {
@ -262,4 +289,10 @@ class PaginationHandler(object):
"end": next_token.to_string(), "end": next_token.to_string(),
} }
if state:
chunk["state"] = [
serialize_event(e, time_now, as_client_event)
for e in state
]
defer.returnValue(chunk) defer.returnValue(chunk)

View File

@ -27,11 +27,22 @@ class VersionsRestServlet(RestServlet):
def on_GET(self, request): def on_GET(self, request):
return (200, { return (200, {
"versions": [ "versions": [
# XXX: at some point we need to decide whether we need to include
# the previous version numbers, given we've defined r0.3.0 to be
# backwards compatible with r0.2.0. But need to check how
# conscientious we've been in compatibility, and decide whether the
# middle number is the major revision when at 0.X.Y (as opposed to
# X.Y.Z). And we need to decide whether it's fair to make clients
# parse the version string to figure out what's going on.
"r0.0.1", "r0.0.1",
"r0.1.0", "r0.1.0",
"r0.2.0", "r0.2.0",
"r0.3.0", "r0.3.0",
] ],
# as per MSC1497:
"unstable_features": {
"m.lazy_load_members": True,
}
}) })