Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Re-introduce "Leave out optional keys from /sync" change #10214

Merged
merged 6 commits into from
Jun 23, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/10214.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Omit empty fields from the `/sync` response. Contributed by @deepbluev7.
69 changes: 46 additions & 23 deletions synapse/rest/client/v2_alpha/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
# limitations under the License.
import itertools
import logging
from collections import defaultdict
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Tuple

from synapse.api.constants import Membership, PresenceState
Expand Down Expand Up @@ -232,29 +233,51 @@ async def encode_response(self, time_now, sync_result, access_token_id, filter):
)

logger.debug("building sync response dict")
return {
"account_data": {"events": sync_result.account_data},
"to_device": {"events": sync_result.to_device},
"device_lists": {
"changed": list(sync_result.device_lists.changed),
"left": list(sync_result.device_lists.left),
},
"presence": SyncRestServlet.encode_presence(sync_result.presence, time_now),
"rooms": {
Membership.JOIN: joined,
Membership.INVITE: invited,
Membership.KNOCK: knocked,
Membership.LEAVE: archived,
},
"groups": {
Membership.JOIN: sync_result.groups.join,
Membership.INVITE: sync_result.groups.invite,
Membership.LEAVE: sync_result.groups.leave,
},
"device_one_time_keys_count": sync_result.device_one_time_keys_count,
"org.matrix.msc2732.device_unused_fallback_key_types": sync_result.device_unused_fallback_key_types,
"next_batch": await sync_result.next_batch.to_string(self.store),
}

response: dict = defaultdict(dict)
response["next_batch"] = await sync_result.next_batch.to_string(self.store)

if sync_result.account_data:
response["account_data"] = {"events": sync_result.account_data}
if sync_result.presence:
response["presence"] = SyncRestServlet.encode_presence(
sync_result.presence, time_now
)

if sync_result.to_device:
response["to_device"] = {"events": sync_result.to_device}

if sync_result.device_lists.changed:
response["device_lists"]["changed"] = list(sync_result.device_lists.changed)
if sync_result.device_lists.left:
response["device_lists"]["left"] = list(sync_result.device_lists.left)

if sync_result.device_one_time_keys_count:
response[
"device_one_time_keys_count"
] = sync_result.device_one_time_keys_count
if sync_result.device_unused_fallback_key_types:
response[
"org.matrix.msc2732.device_unused_fallback_key_types"
] = sync_result.device_unused_fallback_key_types

if joined:
response["rooms"][Membership.JOIN] = joined
if invited:
response["rooms"][Membership.INVITE] = invited
if knocked:
response["rooms"][Membership.KNOCK] = knocked
if archived:
response["rooms"][Membership.LEAVE] = archived

if sync_result.groups.join:
response["groups"][Membership.JOIN] = sync_result.groups.join
if sync_result.groups.invite:
response["groups"][Membership.INVITE] = sync_result.groups.invite
if sync_result.groups.leave:
response["groups"][Membership.LEAVE] = sync_result.groups.leave

return response

@staticmethod
def encode_presence(events, time_now):
Expand Down
30 changes: 1 addition & 29 deletions tests/rest/client/v2_alpha/test_sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,35 +41,7 @@ def test_sync_argless(self):
channel = self.make_request("GET", "/sync")

self.assertEqual(channel.code, 200)
self.assertTrue(
{
"next_batch",
"rooms",
"presence",
"account_data",
"to_device",
"device_lists",
}.issubset(set(channel.json_body.keys()))
)

def test_sync_presence_disabled(self):
"""
When presence is disabled, the key does not appear in /sync.
"""
self.hs.config.use_presence = False

channel = self.make_request("GET", "/sync")

self.assertEqual(channel.code, 200)
self.assertTrue(
{
"next_batch",
"rooms",
"account_data",
"to_device",
"device_lists",
}.issubset(set(channel.json_body.keys()))
)
self.assertIn("next_batch", channel.json_body)


class SyncFilterTestCase(unittest.HomeserverTestCase):
Expand Down
8 changes: 5 additions & 3 deletions tests/server_notices/test_resource_limits_server_notices.py
Original file line number Diff line number Diff line change
Expand Up @@ -306,8 +306,9 @@ def test_no_invite_without_notice(self):

channel = self.make_request("GET", "/sync?timeout=0", access_token=tok)

invites = channel.json_body["rooms"]["invite"]
self.assertEqual(len(invites), 0, invites)
self.assertNotIn(
"rooms", channel.json_body, "Got invites without server notice"
)

def test_invite_with_notice(self):
"""Tests that, if the MAU limit is hit, the server notices user invites each user
Expand Down Expand Up @@ -364,7 +365,8 @@ def _trigger_notice_and_join(self):
# We could also pick another user and sync with it, which would return an
# invite to a system notices room, but it doesn't matter which user we're
# using so we use the last one because it saves us an extra sync.
invites = channel.json_body["rooms"]["invite"]
if "rooms" in channel.json_body:
invites = channel.json_body["rooms"]["invite"]

# Make sure we have an invite to process.
self.assertEqual(len(invites), 1, invites)
Expand Down