0
0
Fork 1
mirror of https://mau.dev/maunium/synapse.git synced 2025-01-22 00:40:12 +01:00

Use a new token format for sliding sync (#17452)

This is in preparation for adding per-connection state.

---------

Co-authored-by: Eric Eastwood <eric.eastwood@beta.gouv.fr>
This commit is contained in:
Erik Johnston 2024-07-24 11:47:25 +01:00 committed by GitHub
parent 4b9f4c2abf
commit 8bbc98e66d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 301 additions and 208 deletions

1
changelog.d/17452.misc Normal file
View file

@ -0,0 +1 @@
Change sliding sync to use their own token format in preparation for storing per-connection state.

View file

@ -49,6 +49,7 @@ from synapse.types import (
PersistedEventPosition, PersistedEventPosition,
Requester, Requester,
RoomStreamToken, RoomStreamToken,
SlidingSyncStreamToken,
StateMap, StateMap,
StreamKeyType, StreamKeyType,
StreamToken, StreamToken,
@ -362,7 +363,7 @@ class SlidingSyncHandler:
self, self,
requester: Requester, requester: Requester,
sync_config: SlidingSyncConfig, sync_config: SlidingSyncConfig,
from_token: Optional[StreamToken] = None, from_token: Optional[SlidingSyncStreamToken] = None,
timeout_ms: int = 0, timeout_ms: int = 0,
) -> SlidingSyncResult: ) -> SlidingSyncResult:
""" """
@ -393,7 +394,7 @@ class SlidingSyncHandler:
# this returns false, it means we timed out waiting, and we should # this returns false, it means we timed out waiting, and we should
# just return an empty response. # just return an empty response.
before_wait_ts = self.clock.time_msec() before_wait_ts = self.clock.time_msec()
if not await self.notifier.wait_for_stream_token(from_token): if not await self.notifier.wait_for_stream_token(from_token.stream_token):
logger.warning( logger.warning(
"Timed out waiting for worker to catch up. Returning empty response" "Timed out waiting for worker to catch up. Returning empty response"
) )
@ -431,7 +432,7 @@ class SlidingSyncHandler:
sync_config.user.to_string(), sync_config.user.to_string(),
timeout_ms, timeout_ms,
current_sync_callback, current_sync_callback,
from_token=from_token, from_token=from_token.stream_token,
) )
return result return result
@ -440,7 +441,7 @@ class SlidingSyncHandler:
self, self,
sync_config: SlidingSyncConfig, sync_config: SlidingSyncConfig,
to_token: StreamToken, to_token: StreamToken,
from_token: Optional[StreamToken] = None, from_token: Optional[SlidingSyncStreamToken] = None,
) -> SlidingSyncResult: ) -> SlidingSyncResult:
""" """
Generates the response body of a Sliding Sync result, represented as a Generates the response body of a Sliding Sync result, represented as a
@ -473,7 +474,7 @@ class SlidingSyncHandler:
await self.get_room_membership_for_user_at_to_token( await self.get_room_membership_for_user_at_to_token(
user=sync_config.user, user=sync_config.user,
to_token=to_token, to_token=to_token,
from_token=from_token, from_token=from_token.stream_token if from_token else None,
) )
) )
@ -631,8 +632,11 @@ class SlidingSyncHandler:
to_token=to_token, to_token=to_token,
) )
# TODO: Update this when we implement per-connection state
connection_token = 0
return SlidingSyncResult( return SlidingSyncResult(
next_pos=to_token, next_pos=SlidingSyncStreamToken(to_token, connection_token),
lists=lists, lists=lists,
rooms=rooms, rooms=rooms,
extensions=extensions, extensions=extensions,
@ -1367,7 +1371,7 @@ class SlidingSyncHandler:
room_id: str, room_id: str,
room_sync_config: RoomSyncConfig, room_sync_config: RoomSyncConfig,
room_membership_for_user_at_to_token: _RoomMembershipForUser, room_membership_for_user_at_to_token: _RoomMembershipForUser,
from_token: Optional[StreamToken], from_token: Optional[SlidingSyncStreamToken],
to_token: StreamToken, to_token: StreamToken,
) -> SlidingSyncResult.RoomResult: ) -> SlidingSyncResult.RoomResult:
""" """
@ -1431,7 +1435,7 @@ class SlidingSyncHandler:
# - TODO: For an incremental sync where we haven't sent it down this # - TODO: For an incremental sync where we haven't sent it down this
# connection before # connection before
to_bound = ( to_bound = (
from_token.room_key from_token.stream_token.room_key
if from_token is not None if from_token is not None
and not room_membership_for_user_at_to_token.newly_joined and not room_membership_for_user_at_to_token.newly_joined
else None else None
@ -1498,7 +1502,9 @@ class SlidingSyncHandler:
instance_name=timeline_event.internal_metadata.instance_name, instance_name=timeline_event.internal_metadata.instance_name,
stream=timeline_event.internal_metadata.stream_ordering, stream=timeline_event.internal_metadata.stream_ordering,
) )
if persisted_position.persisted_after(from_token.room_key): if persisted_position.persisted_after(
from_token.stream_token.room_key
):
num_live += 1 num_live += 1
else: else:
# Since we're iterating over the timeline events in # Since we're iterating over the timeline events in
@ -1786,7 +1792,7 @@ class SlidingSyncHandler:
self, self,
sync_config: SlidingSyncConfig, sync_config: SlidingSyncConfig,
to_token: StreamToken, to_token: StreamToken,
from_token: Optional[StreamToken], from_token: Optional[SlidingSyncStreamToken],
) -> SlidingSyncResult.Extensions: ) -> SlidingSyncResult.Extensions:
"""Handle extension requests. """Handle extension requests.
@ -1900,7 +1906,7 @@ class SlidingSyncHandler:
sync_config: SlidingSyncConfig, sync_config: SlidingSyncConfig,
e2ee_request: SlidingSyncConfig.Extensions.E2eeExtension, e2ee_request: SlidingSyncConfig.Extensions.E2eeExtension,
to_token: StreamToken, to_token: StreamToken,
from_token: Optional[StreamToken], from_token: Optional[SlidingSyncStreamToken],
) -> Optional[SlidingSyncResult.Extensions.E2eeExtension]: ) -> Optional[SlidingSyncResult.Extensions.E2eeExtension]:
"""Handle E2EE device extension (MSC3884) """Handle E2EE device extension (MSC3884)
@ -1922,7 +1928,7 @@ class SlidingSyncHandler:
# TODO: This should take into account the `from_token` and `to_token` # TODO: This should take into account the `from_token` and `to_token`
device_list_updates = await self.device_handler.get_user_ids_changed( device_list_updates = await self.device_handler.get_user_ids_changed(
user_id=user_id, user_id=user_id,
from_token=from_token, from_token=from_token.stream_token,
) )
device_one_time_keys_count: Mapping[str, int] = {} device_one_time_keys_count: Mapping[str, int] = {}

View file

@ -54,7 +54,7 @@ from synapse.http.servlet import (
from synapse.http.site import SynapseRequest from synapse.http.site import SynapseRequest
from synapse.logging.opentracing import trace_with_opname from synapse.logging.opentracing import trace_with_opname
from synapse.rest.admin.experimental_features import ExperimentalFeature from synapse.rest.admin.experimental_features import ExperimentalFeature
from synapse.types import JsonDict, Requester, StreamToken from synapse.types import JsonDict, Requester, SlidingSyncStreamToken, StreamToken
from synapse.types.rest.client import SlidingSyncBody from synapse.types.rest.client import SlidingSyncBody
from synapse.util import json_decoder from synapse.util import json_decoder
from synapse.util.caches.lrucache import LruCache from synapse.util.caches.lrucache import LruCache
@ -889,7 +889,9 @@ class SlidingSyncRestServlet(RestServlet):
from_token = None from_token = None
if from_token_string is not None: if from_token_string is not None:
from_token = await StreamToken.from_string(self.store, from_token_string) from_token = await SlidingSyncStreamToken.from_string(
self.store, from_token_string
)
# TODO: We currently don't know whether we're going to use sticky params or # TODO: We currently don't know whether we're going to use sticky params or
# maybe some filters like sync v2 where they are built up once and referenced # maybe some filters like sync v2 where they are built up once and referenced

View file

@ -1160,6 +1160,49 @@ StreamToken.START = StreamToken(
) )
@attr.s(slots=True, frozen=True, auto_attribs=True)
class SlidingSyncStreamToken:
"""The same as a `StreamToken`, but includes an extra field at the start for
the sliding sync connection token (separated by a '/'). This is used to
store per-connection state.
This then looks something like:
5/s2633508_17_338_6732159_1082514_541479_274711_265584_1_379
Attributes:
stream_token: Token representing the position of all the standard
streams.
connection_position: Token used by sliding sync to track updates to any
per-connection state stored by Synapse.
"""
stream_token: StreamToken
connection_position: int
@staticmethod
@cancellable
async def from_string(store: "DataStore", string: str) -> "SlidingSyncStreamToken":
"""Creates a SlidingSyncStreamToken from its textual representation."""
try:
connection_position_str, stream_token_str = string.split("/", 1)
connection_position = int(connection_position_str)
stream_token = await StreamToken.from_string(store, stream_token_str)
return SlidingSyncStreamToken(
stream_token=stream_token,
connection_position=connection_position,
)
except CancelledError:
raise
except Exception:
raise SynapseError(400, "Invalid stream token")
async def to_string(self, store: "DataStore") -> str:
"""Serializes the token to a string"""
stream_token_str = await self.stream_token.to_string(store)
return f"{self.connection_position}/{stream_token_str}"
@attr.s(slots=True, frozen=True, auto_attribs=True) @attr.s(slots=True, frozen=True, auto_attribs=True)
class PersistedPosition: class PersistedPosition:
"""Position of a newly persisted row with instance that persisted it.""" """Position of a newly persisted row with instance that persisted it."""

View file

@ -31,7 +31,14 @@ else:
from pydantic import Extra from pydantic import Extra
from synapse.events import EventBase from synapse.events import EventBase
from synapse.types import DeviceListUpdates, JsonDict, JsonMapping, StreamToken, UserID from synapse.types import (
DeviceListUpdates,
JsonDict,
JsonMapping,
SlidingSyncStreamToken,
StreamToken,
UserID,
)
from synapse.types.rest.client import SlidingSyncBody from synapse.types.rest.client import SlidingSyncBody
if TYPE_CHECKING: if TYPE_CHECKING:
@ -329,7 +336,7 @@ class SlidingSyncResult:
def __bool__(self) -> bool: def __bool__(self) -> bool:
return bool(self.to_device or self.e2ee) return bool(self.to_device or self.e2ee)
next_pos: StreamToken next_pos: SlidingSyncStreamToken
lists: Dict[str, SlidingWindowList] lists: Dict[str, SlidingWindowList]
rooms: Dict[str, RoomResult] rooms: Dict[str, RoomResult]
extensions: Extensions extensions: Extensions
@ -342,7 +349,7 @@ class SlidingSyncResult:
return bool(self.lists or self.rooms or self.extensions) return bool(self.lists or self.rooms or self.extensions)
@staticmethod @staticmethod
def empty(next_pos: StreamToken) -> "SlidingSyncResult": def empty(next_pos: SlidingSyncStreamToken) -> "SlidingSyncResult":
"Return a new empty result" "Return a new empty result"
return SlidingSyncResult( return SlidingSyncResult(
next_pos=next_pos, next_pos=next_pos,

View file

@ -21,7 +21,7 @@
import json import json
import logging import logging
from http import HTTPStatus from http import HTTPStatus
from typing import Any, Dict, Iterable, List from typing import Any, Dict, Iterable, List, Optional, Tuple
from parameterized import parameterized, parameterized_class from parameterized import parameterized, parameterized_class
@ -50,7 +50,14 @@ from synapse.rest.client import (
sync, sync,
) )
from synapse.server import HomeServer from synapse.server import HomeServer
from synapse.types import JsonDict, RoomStreamToken, StreamKeyType, StreamToken, UserID from synapse.types import (
JsonDict,
RoomStreamToken,
SlidingSyncStreamToken,
StreamKeyType,
StreamToken,
UserID,
)
from synapse.util import Clock from synapse.util import Clock
from tests import unittest from tests import unittest
@ -1225,7 +1232,43 @@ class ExcludeRoomTestCase(unittest.HomeserverTestCase):
self.assertIn(self.included_room_id, channel.json_body["rooms"]["join"]) self.assertIn(self.included_room_id, channel.json_body["rooms"]["join"])
class SlidingSyncTestCase(unittest.HomeserverTestCase): class SlidingSyncBase(unittest.HomeserverTestCase):
"""Base class for sliding sync test cases"""
sync_endpoint = "/_matrix/client/unstable/org.matrix.simplified_msc3575/sync"
def do_sync(
self, sync_body: JsonDict, *, since: Optional[str] = None, tok: str
) -> Tuple[JsonDict, str]:
"""Do a sliding sync request with given body.
Asserts the request was successful.
Attributes:
sync_body: The full request body to use
since: Optional since token
tok: Access token to use
Returns:
A tuple of the response body and the `pos` field.
"""
sync_path = self.sync_endpoint
if since:
sync_path += f"?pos={since}"
channel = self.make_request(
method="POST",
path=sync_path,
content=sync_body,
access_token=tok,
)
self.assertEqual(channel.code, 200, channel.json_body)
return channel.json_body, channel.json_body["pos"]
class SlidingSyncTestCase(SlidingSyncBase):
""" """
Tests regarding MSC3575 Sliding Sync `/sync` endpoint. Tests regarding MSC3575 Sliding Sync `/sync` endpoint.
""" """
@ -1245,10 +1288,6 @@ class SlidingSyncTestCase(unittest.HomeserverTestCase):
return config return config
def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None: def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None:
self.store = hs.get_datastores().main
self.sync_endpoint = (
"/_matrix/client/unstable/org.matrix.simplified_msc3575/sync"
)
self.store = hs.get_datastores().main self.store = hs.get_datastores().main
self.event_sources = hs.get_event_sources() self.event_sources = hs.get_event_sources()
self.storage_controllers = hs.get_storage_controllers() self.storage_controllers = hs.get_storage_controllers()
@ -1496,7 +1535,7 @@ class SlidingSyncTestCase(unittest.HomeserverTestCase):
) )
future_position_token_serialized = self.get_success( future_position_token_serialized = self.get_success(
future_position_token.to_string(self.store) SlidingSyncStreamToken(future_position_token, 0).to_string(self.store)
) )
# Make the Sliding Sync request # Make the Sliding Sync request
@ -1544,15 +1583,7 @@ class SlidingSyncTestCase(unittest.HomeserverTestCase):
room_id = self.helper.create_room_as(user2_id, tok=user2_tok) room_id = self.helper.create_room_as(user2_id, tok=user2_tok)
self.helper.join(room_id, user1_id, tok=user1_tok) self.helper.join(room_id, user1_id, tok=user1_tok)
from_token = self.event_sources.get_current_token() sync_body = {
# Make the Sliding Sync request
channel = self.make_request(
"POST",
self.sync_endpoint
+ "?timeout=10000"
+ f"&pos={self.get_success(from_token.to_string(self.store))}",
{
"lists": { "lists": {
"foo-list": { "foo-list": {
"ranges": [[0, 0]], "ranges": [[0, 0]],
@ -1560,7 +1591,14 @@ class SlidingSyncTestCase(unittest.HomeserverTestCase):
"timeline_limit": 1, "timeline_limit": 1,
} }
} }
}, }
_, from_token = self.do_sync(sync_body, tok=user1_tok)
# Make the Sliding Sync request
channel = self.make_request(
"POST",
self.sync_endpoint + f"?timeout=10000&pos={from_token}",
content=sync_body,
access_token=user1_tok, access_token=user1_tok,
await_result=False, await_result=False,
) )
@ -2771,7 +2809,20 @@ class SlidingSyncTestCase(unittest.HomeserverTestCase):
room_id1, "activity before token2", tok=user2_tok room_id1, "activity before token2", tok=user2_tok
) )
from_token = self.event_sources.get_current_token() # The `timeline_limit` is set to 4 so we can at least see one historical event
# before the `from_token`. We should see historical events because this is a
# `newly_joined` room.
timeline_limit = 4
sync_body = {
"lists": {
"foo-list": {
"ranges": [[0, 1]],
"required_state": [],
"timeline_limit": timeline_limit,
}
}
}
_, from_token = self.do_sync(sync_body, tok=user1_tok)
# Join the room after the `from_token` which will make us consider this room as # Join the room after the `from_token` which will make us consider this room as
# `newly_joined`. # `newly_joined`.
@ -2786,24 +2837,11 @@ class SlidingSyncTestCase(unittest.HomeserverTestCase):
room_id1, "activity after token4", tok=user2_tok room_id1, "activity after token4", tok=user2_tok
) )
# The `timeline_limit` is set to 4 so we can at least see one historical event
# before the `from_token`. We should see historical events because this is a
# `newly_joined` room.
timeline_limit = 4
# Make an incremental Sliding Sync request (what we're trying to test) # Make an incremental Sliding Sync request (what we're trying to test)
channel = self.make_request( channel = self.make_request(
"POST", "POST",
self.sync_endpoint self.sync_endpoint + f"?pos={from_token}",
+ f"?pos={self.get_success(from_token.to_string(self.store))}", content=sync_body,
{
"lists": {
"foo-list": {
"ranges": [[0, 1]],
"required_state": [],
"timeline_limit": timeline_limit,
}
}
},
access_token=user1_tok, access_token=user1_tok,
) )
self.assertEqual(channel.code, 200, channel.json_body) self.assertEqual(channel.code, 200, channel.json_body)
@ -2980,17 +3018,7 @@ class SlidingSyncTestCase(unittest.HomeserverTestCase):
self.helper.send(room_id1, "activity after invite3", tok=user2_tok) self.helper.send(room_id1, "activity after invite3", tok=user2_tok)
self.helper.send(room_id1, "activity after invite4", tok=user2_tok) self.helper.send(room_id1, "activity after invite4", tok=user2_tok)
from_token = self.event_sources.get_current_token() sync_body = {
self.helper.send(room_id1, "activity after token5", tok=user2_tok)
self.helper.send(room_id1, "activity after toekn6", tok=user2_tok)
# Make the Sliding Sync request
channel = self.make_request(
"POST",
self.sync_endpoint
+ f"?pos={self.get_success(from_token.to_string(self.store))}",
{
"lists": { "lists": {
"foo-list": { "foo-list": {
"ranges": [[0, 1]], "ranges": [[0, 1]],
@ -2998,7 +3026,17 @@ class SlidingSyncTestCase(unittest.HomeserverTestCase):
"timeline_limit": 3, "timeline_limit": 3,
} }
} }
}, }
_, from_token = self.do_sync(sync_body, tok=user1_tok)
self.helper.send(room_id1, "activity after token5", tok=user2_tok)
self.helper.send(room_id1, "activity after toekn6", tok=user2_tok)
# Make the Sliding Sync request
channel = self.make_request(
"POST",
self.sync_endpoint + f"?pos={from_token}",
content=sync_body,
access_token=user1_tok, access_token=user1_tok,
) )
self.assertEqual(channel.code, 200, channel.json_body) self.assertEqual(channel.code, 200, channel.json_body)
@ -3237,17 +3275,7 @@ class SlidingSyncTestCase(unittest.HomeserverTestCase):
self.helper.send(room_id1, "activity after invite3", tok=user2_tok) self.helper.send(room_id1, "activity after invite3", tok=user2_tok)
self.helper.send(room_id1, "activity after invite4", tok=user2_tok) self.helper.send(room_id1, "activity after invite4", tok=user2_tok)
from_token = self.event_sources.get_current_token() sync_body = {
self.helper.send(room_id1, "activity after token5", tok=user2_tok)
self.helper.send(room_id1, "activity after toekn6", tok=user2_tok)
# Make the Sliding Sync request
channel = self.make_request(
"POST",
self.sync_endpoint
+ f"?pos={self.get_success(from_token.to_string(self.store))}",
{
"lists": { "lists": {
"foo-list": { "foo-list": {
"ranges": [[0, 1]], "ranges": [[0, 1]],
@ -3256,7 +3284,17 @@ class SlidingSyncTestCase(unittest.HomeserverTestCase):
"timeline_limit": 4, "timeline_limit": 4,
} }
} }
}, }
_, from_token = self.do_sync(sync_body, tok=user1_tok)
self.helper.send(room_id1, "activity after token5", tok=user2_tok)
self.helper.send(room_id1, "activity after toekn6", tok=user2_tok)
# Make the Sliding Sync request
channel = self.make_request(
"POST",
self.sync_endpoint + f"?pos={from_token}",
content=sync_body,
access_token=user1_tok, access_token=user1_tok,
) )
self.assertEqual(channel.code, 200, channel.json_body) self.assertEqual(channel.code, 200, channel.json_body)
@ -3402,7 +3440,16 @@ class SlidingSyncTestCase(unittest.HomeserverTestCase):
self.helper.send(room_id1, "activity before2", tok=user2_tok) self.helper.send(room_id1, "activity before2", tok=user2_tok)
self.helper.join(room_id1, user1_id, tok=user1_tok) self.helper.join(room_id1, user1_id, tok=user1_tok)
from_token = self.event_sources.get_current_token() sync_body = {
"lists": {
"foo-list": {
"ranges": [[0, 1]],
"required_state": [],
"timeline_limit": 4,
}
}
}
_, from_token = self.do_sync(sync_body, tok=user1_tok)
event_response3 = self.helper.send(room_id1, "activity after3", tok=user2_tok) event_response3 = self.helper.send(room_id1, "activity after3", tok=user2_tok)
event_response4 = self.helper.send(room_id1, "activity after4", tok=user2_tok) event_response4 = self.helper.send(room_id1, "activity after4", tok=user2_tok)
@ -3418,17 +3465,8 @@ class SlidingSyncTestCase(unittest.HomeserverTestCase):
# Make the Sliding Sync request # Make the Sliding Sync request
channel = self.make_request( channel = self.make_request(
"POST", "POST",
self.sync_endpoint self.sync_endpoint + f"?pos={from_token}",
+ f"?pos={self.get_success(from_token.to_string(self.store))}", content=sync_body,
{
"lists": {
"foo-list": {
"ranges": [[0, 1]],
"required_state": [],
"timeline_limit": 4,
}
}
},
access_token=user1_tok, access_token=user1_tok,
) )
self.assertEqual(channel.code, 200, channel.json_body) self.assertEqual(channel.code, 200, channel.json_body)
@ -3479,16 +3517,7 @@ class SlidingSyncTestCase(unittest.HomeserverTestCase):
self.helper.send(room_id1, "activity after3", tok=user2_tok) self.helper.send(room_id1, "activity after3", tok=user2_tok)
from_token = self.event_sources.get_current_token() sync_body = {
self.helper.send(room_id1, "activity after4", tok=user2_tok)
# Make the Sliding Sync request
channel = self.make_request(
"POST",
self.sync_endpoint
+ f"?pos={self.get_success(from_token.to_string(self.store))}",
{
"lists": { "lists": {
"foo-list": { "foo-list": {
"ranges": [[0, 1]], "ranges": [[0, 1]],
@ -3496,7 +3525,16 @@ class SlidingSyncTestCase(unittest.HomeserverTestCase):
"timeline_limit": 4, "timeline_limit": 4,
} }
} }
}, }
_, from_token = self.do_sync(sync_body, tok=user1_tok)
self.helper.send(room_id1, "activity after4", tok=user2_tok)
# Make the Sliding Sync request
channel = self.make_request(
"POST",
self.sync_endpoint + f"?pos={from_token}",
content=sync_body,
access_token=user1_tok, access_token=user1_tok,
) )
self.assertEqual(channel.code, 200, channel.json_body) self.assertEqual(channel.code, 200, channel.json_body)
@ -3614,14 +3652,7 @@ class SlidingSyncTestCase(unittest.HomeserverTestCase):
room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok) room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
self.helper.join(room_id1, user1_id, tok=user1_tok) self.helper.join(room_id1, user1_id, tok=user1_tok)
after_room_token = self.event_sources.get_current_token() sync_body = {
# Make the Sliding Sync request
channel = self.make_request(
"POST",
self.sync_endpoint
+ f"?pos={self.get_success(after_room_token.to_string(self.store))}",
{
"lists": { "lists": {
"foo-list": { "foo-list": {
"ranges": [[0, 1]], "ranges": [[0, 1]],
@ -3634,7 +3665,14 @@ class SlidingSyncTestCase(unittest.HomeserverTestCase):
"timeline_limit": 0, "timeline_limit": 0,
} }
} }
}, }
_, after_room_token = self.do_sync(sync_body, tok=user1_tok)
# Make the Sliding Sync request
channel = self.make_request(
"POST",
self.sync_endpoint + f"?pos={after_room_token}",
content=sync_body,
access_token=user1_tok, access_token=user1_tok,
) )
self.assertEqual(channel.code, 200, channel.json_body) self.assertEqual(channel.code, 200, channel.json_body)
@ -3966,7 +4004,20 @@ class SlidingSyncTestCase(unittest.HomeserverTestCase):
user3_id = self.register_user("user3", "pass") user3_id = self.register_user("user3", "pass")
user3_tok = self.login(user3_id, "pass") user3_tok = self.login(user3_id, "pass")
from_token = self.event_sources.get_current_token() sync_body = {
"lists": {
"foo-list": {
"ranges": [[0, 1]],
"required_state": [
[EventTypes.Create, ""],
[EventTypes.Member, "*"],
["org.matrix.foo_state", ""],
],
"timeline_limit": 3,
}
}
}
_, from_token = self.do_sync(sync_body, tok=user1_tok)
room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok) room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
self.helper.join(room_id1, user1_id, tok=user1_tok) self.helper.join(room_id1, user1_id, tok=user1_tok)
@ -4004,21 +4055,8 @@ class SlidingSyncTestCase(unittest.HomeserverTestCase):
# Make the Sliding Sync request with lazy loading for the room members # Make the Sliding Sync request with lazy loading for the room members
channel = self.make_request( channel = self.make_request(
"POST", "POST",
self.sync_endpoint self.sync_endpoint + f"?pos={from_token}",
+ f"?pos={self.get_success(from_token.to_string(self.store))}", content=sync_body,
{
"lists": {
"foo-list": {
"ranges": [[0, 1]],
"required_state": [
[EventTypes.Create, ""],
[EventTypes.Member, "*"],
["org.matrix.foo_state", ""],
],
"timeline_limit": 3,
}
}
},
access_token=user1_tok, access_token=user1_tok,
) )
self.assertEqual(channel.code, 200, channel.json_body) self.assertEqual(channel.code, 200, channel.json_body)
@ -4468,7 +4506,7 @@ class SlidingSyncTestCase(unittest.HomeserverTestCase):
) )
class SlidingSyncToDeviceExtensionTestCase(unittest.HomeserverTestCase): class SlidingSyncToDeviceExtensionTestCase(SlidingSyncBase):
"""Tests for the to-device sliding sync extension""" """Tests for the to-device sliding sync extension"""
servlets = [ servlets = [
@ -4714,22 +4752,21 @@ class SlidingSyncToDeviceExtensionTestCase(unittest.HomeserverTestCase):
user2_id = self.register_user("u2", "pass") user2_id = self.register_user("u2", "pass")
user2_tok = self.login(user2_id, "pass", "d2") user2_tok = self.login(user2_id, "pass", "d2")
from_token = self.event_sources.get_current_token() sync_body = {
# Make the Sliding Sync request
channel = self.make_request(
"POST",
self.sync_endpoint
+ "?timeout=10000"
+ f"&pos={self.get_success(from_token.to_string(self.store))}",
{
"lists": {}, "lists": {},
"extensions": { "extensions": {
"to_device": { "to_device": {
"enabled": True, "enabled": True,
} }
}, },
}, }
_, from_token = self.do_sync(sync_body, tok=user1_tok)
# Make the Sliding Sync request
channel = self.make_request(
"POST",
self.sync_endpoint + "?timeout=10000" + f"&pos={from_token}",
content=sync_body,
access_token=user1_tok, access_token=user1_tok,
await_result=False, await_result=False,
) )
@ -4765,22 +4802,21 @@ class SlidingSyncToDeviceExtensionTestCase(unittest.HomeserverTestCase):
user1_id = self.register_user("user1", "pass") user1_id = self.register_user("user1", "pass")
user1_tok = self.login(user1_id, "pass") user1_tok = self.login(user1_id, "pass")
from_token = self.event_sources.get_current_token() sync_body = {
# Make the Sliding Sync request
channel = self.make_request(
"POST",
self.sync_endpoint
+ "?timeout=10000"
+ f"&pos={self.get_success(from_token.to_string(self.store))}",
{
"lists": {}, "lists": {},
"extensions": { "extensions": {
"to_device": { "to_device": {
"enabled": True, "enabled": True,
} }
}, },
}, }
_, from_token = self.do_sync(sync_body, tok=user1_tok)
# Make the Sliding Sync request
channel = self.make_request(
"POST",
self.sync_endpoint + "?timeout=10000" + f"&pos={from_token}",
content=sync_body,
access_token=user1_tok, access_token=user1_tok,
await_result=False, await_result=False,
) )
@ -4801,7 +4837,7 @@ class SlidingSyncToDeviceExtensionTestCase(unittest.HomeserverTestCase):
self._assert_to_device_response(channel, []) self._assert_to_device_response(channel, [])
class SlidingSyncE2eeExtensionTestCase(unittest.HomeserverTestCase): class SlidingSyncE2eeExtensionTestCase(SlidingSyncBase):
"""Tests for the e2ee sliding sync extension""" """Tests for the e2ee sliding sync extension"""
servlets = [ servlets = [
@ -4924,21 +4960,21 @@ class SlidingSyncE2eeExtensionTestCase(unittest.HomeserverTestCase):
user1_id = self.register_user("user1", "pass") user1_id = self.register_user("user1", "pass")
user1_tok = self.login(user1_id, "pass") user1_tok = self.login(user1_id, "pass")
from_token = self.event_sources.get_current_token() sync_body = {
# Make an incremental Sliding Sync request with the e2ee extension enabled
channel = self.make_request(
"POST",
self.sync_endpoint
+ f"?pos={self.get_success(from_token.to_string(self.store))}",
{
"lists": {}, "lists": {},
"extensions": { "extensions": {
"e2ee": { "e2ee": {
"enabled": True, "enabled": True,
} }
}, },
}, }
_, from_token = self.do_sync(sync_body, tok=user1_tok)
# Make an incremental Sliding Sync request with the e2ee extension enabled
channel = self.make_request(
"POST",
self.sync_endpoint + f"?pos={from_token}",
content=sync_body,
access_token=user1_tok, access_token=user1_tok,
) )
self.assertEqual(channel.code, 200, channel.json_body) self.assertEqual(channel.code, 200, channel.json_body)
@ -4992,22 +5028,21 @@ class SlidingSyncE2eeExtensionTestCase(unittest.HomeserverTestCase):
self.helper.join(room_id, user1_id, tok=user1_tok) self.helper.join(room_id, user1_id, tok=user1_tok)
self.helper.join(room_id, user3_id, tok=user3_tok) self.helper.join(room_id, user3_id, tok=user3_tok)
from_token = self.event_sources.get_current_token() sync_body = {
# Make the Sliding Sync request
channel = self.make_request(
"POST",
self.sync_endpoint
+ "?timeout=10000"
+ f"&pos={self.get_success(from_token.to_string(self.store))}",
{
"lists": {}, "lists": {},
"extensions": { "extensions": {
"e2ee": { "e2ee": {
"enabled": True, "enabled": True,
} }
}, },
}, }
_, from_token = self.do_sync(sync_body, tok=user1_tok)
# Make the Sliding Sync request
channel = self.make_request(
"POST",
self.sync_endpoint + "?timeout=10000" + f"&pos={from_token}",
content=sync_body,
access_token=user1_tok, access_token=user1_tok,
await_result=False, await_result=False,
) )
@ -5053,22 +5088,21 @@ class SlidingSyncE2eeExtensionTestCase(unittest.HomeserverTestCase):
user1_id = self.register_user("user1", "pass") user1_id = self.register_user("user1", "pass")
user1_tok = self.login(user1_id, "pass") user1_tok = self.login(user1_id, "pass")
from_token = self.event_sources.get_current_token() sync_body = {
# Make the Sliding Sync request
channel = self.make_request(
"POST",
self.sync_endpoint
+ "?timeout=10000"
+ f"&pos={self.get_success(from_token.to_string(self.store))}",
{
"lists": {}, "lists": {},
"extensions": { "extensions": {
"e2ee": { "e2ee": {
"enabled": True, "enabled": True,
} }
}, },
}, }
_, from_token = self.do_sync(sync_body, tok=user1_tok)
# Make the Sliding Sync request
channel = self.make_request(
"POST",
self.sync_endpoint + f"?timeout=10000&pos={from_token}",
content=sync_body,
access_token=user1_tok, access_token=user1_tok,
await_result=False, await_result=False,
) )
@ -5138,7 +5172,15 @@ class SlidingSyncE2eeExtensionTestCase(unittest.HomeserverTestCase):
self.helper.join(room_id, user3_id, tok=user3_tok) self.helper.join(room_id, user3_id, tok=user3_tok)
self.helper.join(room_id, user4_id, tok=user4_tok) self.helper.join(room_id, user4_id, tok=user4_tok)
from_token = self.event_sources.get_current_token() sync_body = {
"lists": {},
"extensions": {
"e2ee": {
"enabled": True,
}
},
}
_, from_token = self.do_sync(sync_body, tok=user1_tok)
# Have user3 update their device list # Have user3 update their device list
channel = self.make_request( channel = self.make_request(
@ -5157,16 +5199,8 @@ class SlidingSyncE2eeExtensionTestCase(unittest.HomeserverTestCase):
# Make an incremental Sliding Sync request with the e2ee extension enabled # Make an incremental Sliding Sync request with the e2ee extension enabled
channel = self.make_request( channel = self.make_request(
"POST", "POST",
self.sync_endpoint self.sync_endpoint + f"?pos={from_token}",
+ f"?pos={self.get_success(from_token.to_string(self.store))}", content=sync_body,
{
"lists": {},
"extensions": {
"e2ee": {
"enabled": True,
}
},
},
access_token=user1_tok, access_token=user1_tok,
) )
self.assertEqual(channel.code, 200, channel.json_body) self.assertEqual(channel.code, 200, channel.json_body)