diff --git a/synapse/handlers/sliding_sync.py b/synapse/handlers/sliding_sync.py index e2fc578ac8..ccee85b63b 100644 --- a/synapse/handlers/sliding_sync.py +++ b/synapse/handlers/sliding_sync.py @@ -192,7 +192,7 @@ class SlidingSyncHandler: if timeout == 0 or from_token is None: now_token = self.event_sources.get_current_token() - return await self.current_sync_for_user( + result = await self.current_sync_for_user( sync_config, from_token=from_token, to_token=now_token, @@ -215,6 +215,8 @@ class SlidingSyncHandler: from_token=from_token, ) + return result + async def current_sync_for_user( self, sync_config: SlidingSyncConfig, @@ -249,11 +251,11 @@ class SlidingSyncHandler: ops: List[SlidingSyncResult.SlidingWindowList.Operation] = [] for range in list_config.ranges: ops.append( - { - "op": OperationType.SYNC, - "range": range, - "room_ids": sorted_room_ids[range[0] : range[1]], - } + SlidingSyncResult.SlidingWindowList.Operation( + op=OperationType.SYNC, + range=range, + room_ids=sorted_room_ids[range[0] : range[1]], + ) ) lists[list_key] = SlidingSyncResult.SlidingWindowList( @@ -426,7 +428,7 @@ class SlidingSyncHandler: # `to_token`. if ( last_membership_change_after_to_token.membership == Membership.LEAVE - and prev_membership != None + and prev_membership is not None and prev_membership != Membership.LEAVE ): sync_room_id_set.add(room_id) @@ -438,7 +440,7 @@ class SlidingSyncHandler: # the room before the `to_token`. elif ( last_membership_change_after_to_token.membership != Membership.LEAVE - and (prev_membership == None or prev_membership == Membership.LEAVE) + and (prev_membership is None or prev_membership == Membership.LEAVE) ): sync_room_id_set.discard(room_id) diff --git a/synapse/rest/client/sync.py b/synapse/rest/client/sync.py index 92bde70011..a08b8df388 100644 --- a/synapse/rest/client/sync.py +++ b/synapse/rest/client/sync.py @@ -33,7 +33,7 @@ from synapse.events.utils import ( format_event_raw, ) from synapse.handlers.presence import format_user_presence_state -from synapse.handlers.sliding_sync import SlidingSyncConfig +from synapse.handlers.sliding_sync import SlidingSyncConfig, SlidingSyncResult from synapse.handlers.sync import ( ArchivedSyncResult, InvitedSyncResult, @@ -810,7 +810,44 @@ class SlidingSyncRestServlet(RestServlet): logger.info("sliding_sync_results: %s", sliding_sync_results) - return 200, {"foo": "bar"} + response_content = await self.encode_response(sliding_sync_results) + + return 200, response_content + + # TODO: Is there a better way to encode things? + async def encode_response( + self, + sliding_sync_result: SlidingSyncResult, + ) -> JsonDict: + response: JsonDict = defaultdict(dict) + + response["next_pos"] = await sliding_sync_result.next_pos.to_string(self.store) + response["lists"] = self.encode_lists(sliding_sync_result.lists) + response["rooms"] = {} # TODO: sliding_sync_result.rooms + response["extensions"] = {} # TODO: sliding_sync_result.extensions + + return response + + def encode_lists( + self, lists: Dict[str, SlidingSyncResult.SlidingWindowList] + ) -> JsonDict: + def encode_operation( + operation: SlidingSyncResult.SlidingWindowList.Operation, + ) -> JsonDict: + return { + "op": operation.op, + "range": operation.range, + "room_ids": operation.room_ids, + } + + serialized_lists = {} + for list_key, list_result in lists.items(): + serialized_lists[list_key] = { + "count": list_result.count, + "ops": [encode_operation(op) for op in list_result.ops], + } + + return serialized_lists def register_servlets(hs: "HomeServer", http_server: HttpServer) -> None: