Move MSC3030 `/timestamp_to_event` endpoint to stable v1 location (#14471)
Fix https://github.com/matrix-org/synapse/issues/14390 - Client API: `/_matrix/client/unstable/org.matrix.msc3030/rooms/<roomID>/timestamp_to_event?ts=<timestamp>&dir=<direction>` -> `/_matrix/client/v1/rooms/<roomID>/timestamp_to_event?ts=<timestamp>&dir=<direction>` - Federation API: `/_matrix/federation/unstable/org.matrix.msc3030/timestamp_to_event/<roomID>?ts=<timestamp>&dir=<direction>` -> `/_matrix/federation/v1/timestamp_to_event/<roomID>?ts=<timestamp>&dir=<direction>` Complement test changes: https://github.com/matrix-org/complement/pull/559pull/14521/head
parent
1183c372fa
commit
8f10c8b054
|
@ -0,0 +1 @@
|
||||||
|
Move MSC3030 `/timestamp_to_event` endpoints to stable `v1` location (`/_matrix/client/v1/rooms/<roomID>/timestamp_to_event?ts=<timestamp>&dir=<direction>`, `/_matrix/federation/v1/timestamp_to_event/<roomID>?ts=<timestamp>&dir=<direction>`).
|
|
@ -100,8 +100,6 @@ experimental_features:
|
||||||
# client-side support for partial state in /send_join responses
|
# client-side support for partial state in /send_join responses
|
||||||
faster_joins: true
|
faster_joins: true
|
||||||
{% endif %}
|
{% endif %}
|
||||||
# Enable jump to date endpoint
|
|
||||||
msc3030_enabled: true
|
|
||||||
# Filtering /messages by relation type.
|
# Filtering /messages by relation type.
|
||||||
msc3874_enabled: true
|
msc3874_enabled: true
|
||||||
|
|
||||||
|
|
|
@ -140,6 +140,7 @@ WORKERS_CONFIG: Dict[str, Dict[str, Any]] = {
|
||||||
"^/_matrix/client/(api/v1|r0|v3|unstable)/rooms/.*/event",
|
"^/_matrix/client/(api/v1|r0|v3|unstable)/rooms/.*/event",
|
||||||
"^/_matrix/client/(api/v1|r0|v3|unstable)/joined_rooms",
|
"^/_matrix/client/(api/v1|r0|v3|unstable)/joined_rooms",
|
||||||
"^/_matrix/client/(api/v1|r0|v3|unstable/.*)/rooms/.*/aliases",
|
"^/_matrix/client/(api/v1|r0|v3|unstable/.*)/rooms/.*/aliases",
|
||||||
|
"^/_matrix/client/v1/rooms/.*/timestamp_to_event$",
|
||||||
"^/_matrix/client/(api/v1|r0|v3|unstable)/search",
|
"^/_matrix/client/(api/v1|r0|v3|unstable)/search",
|
||||||
],
|
],
|
||||||
"shared_extra_conf": {},
|
"shared_extra_conf": {},
|
||||||
|
@ -163,6 +164,7 @@ WORKERS_CONFIG: Dict[str, Dict[str, Any]] = {
|
||||||
"^/_matrix/federation/(v1|v2)/invite/",
|
"^/_matrix/federation/(v1|v2)/invite/",
|
||||||
"^/_matrix/federation/(v1|v2)/query_auth/",
|
"^/_matrix/federation/(v1|v2)/query_auth/",
|
||||||
"^/_matrix/federation/(v1|v2)/event_auth/",
|
"^/_matrix/federation/(v1|v2)/event_auth/",
|
||||||
|
"^/_matrix/federation/v1/timestamp_to_event/",
|
||||||
"^/_matrix/federation/(v1|v2)/exchange_third_party_invite/",
|
"^/_matrix/federation/(v1|v2)/exchange_third_party_invite/",
|
||||||
"^/_matrix/federation/(v1|v2)/user/devices/",
|
"^/_matrix/federation/(v1|v2)/user/devices/",
|
||||||
"^/_matrix/federation/(v1|v2)/get_groups_publicised$",
|
"^/_matrix/federation/(v1|v2)/get_groups_publicised$",
|
||||||
|
|
|
@ -191,6 +191,7 @@ information.
|
||||||
^/_matrix/federation/(v1|v2)/send_leave/
|
^/_matrix/federation/(v1|v2)/send_leave/
|
||||||
^/_matrix/federation/(v1|v2)/invite/
|
^/_matrix/federation/(v1|v2)/invite/
|
||||||
^/_matrix/federation/v1/event_auth/
|
^/_matrix/federation/v1/event_auth/
|
||||||
|
^/_matrix/federation/v1/timestamp_to_event/
|
||||||
^/_matrix/federation/v1/exchange_third_party_invite/
|
^/_matrix/federation/v1/exchange_third_party_invite/
|
||||||
^/_matrix/federation/v1/user/devices/
|
^/_matrix/federation/v1/user/devices/
|
||||||
^/_matrix/key/v2/query
|
^/_matrix/key/v2/query
|
||||||
|
@ -218,6 +219,7 @@ information.
|
||||||
^/_matrix/client/(api/v1|r0|v3|unstable)/voip/turnServer$
|
^/_matrix/client/(api/v1|r0|v3|unstable)/voip/turnServer$
|
||||||
^/_matrix/client/(api/v1|r0|v3|unstable)/rooms/.*/event/
|
^/_matrix/client/(api/v1|r0|v3|unstable)/rooms/.*/event/
|
||||||
^/_matrix/client/(api/v1|r0|v3|unstable)/joined_rooms$
|
^/_matrix/client/(api/v1|r0|v3|unstable)/joined_rooms$
|
||||||
|
^/_matrix/client/v1/rooms/.*/timestamp_to_event$
|
||||||
^/_matrix/client/(api/v1|r0|v3|unstable)/search$
|
^/_matrix/client/(api/v1|r0|v3|unstable)/search$
|
||||||
|
|
||||||
# Encryption requests
|
# Encryption requests
|
||||||
|
|
|
@ -162,9 +162,9 @@ else
|
||||||
# We only test faster room joins on monoliths, because they are purposefully
|
# We only test faster room joins on monoliths, because they are purposefully
|
||||||
# being developed without worker support to start with.
|
# being developed without worker support to start with.
|
||||||
#
|
#
|
||||||
# The tests for importing historical messages (MSC2716) and jump to date (MSC3030)
|
# The tests for importing historical messages (MSC2716) also only pass with monoliths,
|
||||||
# also only pass with monoliths, currently.
|
# currently.
|
||||||
test_tags="$test_tags,faster_joins,msc2716,msc3030"
|
test_tags="$test_tags,faster_joins,msc2716"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -53,9 +53,6 @@ class ExperimentalConfig(Config):
|
||||||
# MSC3266 (room summary api)
|
# MSC3266 (room summary api)
|
||||||
self.msc3266_enabled: bool = experimental.get("msc3266_enabled", False)
|
self.msc3266_enabled: bool = experimental.get("msc3266_enabled", False)
|
||||||
|
|
||||||
# MSC3030 (Jump to date API endpoint)
|
|
||||||
self.msc3030_enabled: bool = experimental.get("msc3030_enabled", False)
|
|
||||||
|
|
||||||
# MSC2409 (this setting only relates to optionally sending to-device messages).
|
# MSC2409 (this setting only relates to optionally sending to-device messages).
|
||||||
# Presence, typing and read receipt EDUs are already sent to application services that
|
# Presence, typing and read receipt EDUs are already sent to application services that
|
||||||
# have opted in to receive them. If enabled, this adds to-device messages to that list.
|
# have opted in to receive them. If enabled, this adds to-device messages to that list.
|
||||||
|
|
|
@ -1691,9 +1691,19 @@ class FederationClient(FederationBase):
|
||||||
# to return events on *both* sides of the timestamp to
|
# to return events on *both* sides of the timestamp to
|
||||||
# help reconcile the gap faster.
|
# help reconcile the gap faster.
|
||||||
_timestamp_to_event_from_destination,
|
_timestamp_to_event_from_destination,
|
||||||
|
# Since this endpoint is new, we should try other servers before giving up.
|
||||||
|
# We can safely remove this in a year (remove after 2023-11-16).
|
||||||
|
failover_on_unknown_endpoint=True,
|
||||||
)
|
)
|
||||||
return timestamp_to_event_response
|
return timestamp_to_event_response
|
||||||
except SynapseError:
|
except SynapseError as e:
|
||||||
|
logger.warn(
|
||||||
|
"timestamp_to_event(room_id=%s, timestamp=%s, direction=%s): encountered error when trying to fetch from destinations: %s",
|
||||||
|
room_id,
|
||||||
|
timestamp,
|
||||||
|
direction,
|
||||||
|
e,
|
||||||
|
)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
async def _timestamp_to_event_from_destination(
|
async def _timestamp_to_event_from_destination(
|
||||||
|
|
|
@ -185,9 +185,8 @@ class TransportLayerClient:
|
||||||
Raises:
|
Raises:
|
||||||
Various exceptions when the request fails
|
Various exceptions when the request fails
|
||||||
"""
|
"""
|
||||||
path = _create_path(
|
path = _create_v1_path(
|
||||||
FEDERATION_UNSTABLE_PREFIX,
|
"/timestamp_to_event/%s",
|
||||||
"/org.matrix.msc3030/timestamp_to_event/%s",
|
|
||||||
room_id,
|
room_id,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,6 @@ from synapse.federation.transport.server._base import (
|
||||||
from synapse.federation.transport.server.federation import (
|
from synapse.federation.transport.server.federation import (
|
||||||
FEDERATION_SERVLET_CLASSES,
|
FEDERATION_SERVLET_CLASSES,
|
||||||
FederationAccountStatusServlet,
|
FederationAccountStatusServlet,
|
||||||
FederationTimestampLookupServlet,
|
|
||||||
)
|
)
|
||||||
from synapse.http.server import HttpServer, JsonResource
|
from synapse.http.server import HttpServer, JsonResource
|
||||||
from synapse.http.servlet import (
|
from synapse.http.servlet import (
|
||||||
|
@ -291,13 +290,6 @@ def register_servlets(
|
||||||
)
|
)
|
||||||
|
|
||||||
for servletclass in SERVLET_GROUPS[servlet_group]:
|
for servletclass in SERVLET_GROUPS[servlet_group]:
|
||||||
# Only allow the `/timestamp_to_event` servlet if msc3030 is enabled
|
|
||||||
if (
|
|
||||||
servletclass == FederationTimestampLookupServlet
|
|
||||||
and not hs.config.experimental.msc3030_enabled
|
|
||||||
):
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Only allow the `/account_status` servlet if msc3720 is enabled
|
# Only allow the `/account_status` servlet if msc3720 is enabled
|
||||||
if (
|
if (
|
||||||
servletclass == FederationAccountStatusServlet
|
servletclass == FederationAccountStatusServlet
|
||||||
|
|
|
@ -218,14 +218,13 @@ class FederationTimestampLookupServlet(BaseFederationServerServlet):
|
||||||
`dir` can be `f` or `b` to indicate forwards and backwards in time from the
|
`dir` can be `f` or `b` to indicate forwards and backwards in time from the
|
||||||
given timestamp.
|
given timestamp.
|
||||||
|
|
||||||
GET /_matrix/federation/unstable/org.matrix.msc3030/timestamp_to_event/<roomID>?ts=<timestamp>&dir=<direction>
|
GET /_matrix/federation/v1/timestamp_to_event/<roomID>?ts=<timestamp>&dir=<direction>
|
||||||
{
|
{
|
||||||
"event_id": ...
|
"event_id": ...
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
PATH = "/timestamp_to_event/(?P<room_id>[^/]*)/?"
|
PATH = "/timestamp_to_event/(?P<room_id>[^/]*)/?"
|
||||||
PREFIX = FEDERATION_UNSTABLE_PREFIX + "/org.matrix.msc3030"
|
|
||||||
|
|
||||||
async def on_GET(
|
async def on_GET(
|
||||||
self,
|
self,
|
||||||
|
|
|
@ -1284,17 +1284,14 @@ class TimestampLookupRestServlet(RestServlet):
|
||||||
`dir` can be `f` or `b` to indicate forwards and backwards in time from the
|
`dir` can be `f` or `b` to indicate forwards and backwards in time from the
|
||||||
given timestamp.
|
given timestamp.
|
||||||
|
|
||||||
GET /_matrix/client/unstable/org.matrix.msc3030/rooms/<roomID>/timestamp_to_event?ts=<timestamp>&dir=<direction>
|
GET /_matrix/client/v1/rooms/<roomID>/timestamp_to_event?ts=<timestamp>&dir=<direction>
|
||||||
{
|
{
|
||||||
"event_id": ...
|
"event_id": ...
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
PATTERNS = (
|
PATTERNS = (
|
||||||
re.compile(
|
re.compile("^/_matrix/client/v1/rooms/(?P<room_id>[^/]*)/timestamp_to_event$"),
|
||||||
"^/_matrix/client/unstable/org.matrix.msc3030"
|
|
||||||
"/rooms/(?P<room_id>[^/]*)/timestamp_to_event$"
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def __init__(self, hs: "HomeServer"):
|
def __init__(self, hs: "HomeServer"):
|
||||||
|
@ -1421,8 +1418,7 @@ def register_servlets(
|
||||||
RoomAliasListServlet(hs).register(http_server)
|
RoomAliasListServlet(hs).register(http_server)
|
||||||
SearchRestServlet(hs).register(http_server)
|
SearchRestServlet(hs).register(http_server)
|
||||||
RoomCreateRestServlet(hs).register(http_server)
|
RoomCreateRestServlet(hs).register(http_server)
|
||||||
if hs.config.experimental.msc3030_enabled:
|
TimestampLookupRestServlet(hs).register(http_server)
|
||||||
TimestampLookupRestServlet(hs).register(http_server)
|
|
||||||
|
|
||||||
# Some servlets only get registered for the main process.
|
# Some servlets only get registered for the main process.
|
||||||
if not is_worker:
|
if not is_worker:
|
||||||
|
|
|
@ -101,8 +101,6 @@ class VersionsRestServlet(RestServlet):
|
||||||
"org.matrix.msc3827.stable": True,
|
"org.matrix.msc3827.stable": True,
|
||||||
# Adds support for importing historical messages as per MSC2716
|
# Adds support for importing historical messages as per MSC2716
|
||||||
"org.matrix.msc2716": self.config.experimental.msc2716_enabled,
|
"org.matrix.msc2716": self.config.experimental.msc2716_enabled,
|
||||||
# Adds support for jump to date endpoints (/timestamp_to_event) as per MSC3030
|
|
||||||
"org.matrix.msc3030": self.config.experimental.msc3030_enabled,
|
|
||||||
# Adds support for thread relations, per MSC3440.
|
# Adds support for thread relations, per MSC3440.
|
||||||
"org.matrix.msc3440.stable": True, # TODO: remove when "v1.3" is added above
|
"org.matrix.msc3440.stable": True, # TODO: remove when "v1.3" is added above
|
||||||
# Support for thread read receipts & notification counts.
|
# Support for thread read receipts & notification counts.
|
||||||
|
|
|
@ -3546,11 +3546,6 @@ class TimestampLookupTestCase(unittest.HomeserverTestCase):
|
||||||
login.register_servlets,
|
login.register_servlets,
|
||||||
]
|
]
|
||||||
|
|
||||||
def default_config(self) -> JsonDict:
|
|
||||||
config = super().default_config()
|
|
||||||
config["experimental_features"] = {"msc3030_enabled": True}
|
|
||||||
return config
|
|
||||||
|
|
||||||
def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None:
|
def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None:
|
||||||
self._storage_controllers = self.hs.get_storage_controllers()
|
self._storage_controllers = self.hs.get_storage_controllers()
|
||||||
|
|
||||||
|
@ -3592,7 +3587,7 @@ class TimestampLookupTestCase(unittest.HomeserverTestCase):
|
||||||
|
|
||||||
channel = self.make_request(
|
channel = self.make_request(
|
||||||
"GET",
|
"GET",
|
||||||
f"/_matrix/client/unstable/org.matrix.msc3030/rooms/{room_id}/timestamp_to_event?dir=b&ts={outlier_event.origin_server_ts}",
|
f"/_matrix/client/v1/rooms/{room_id}/timestamp_to_event?dir=b&ts={outlier_event.origin_server_ts}",
|
||||||
access_token=self.room_owner_tok,
|
access_token=self.room_owner_tok,
|
||||||
)
|
)
|
||||||
self.assertEqual(HTTPStatus.OK, channel.code, msg=channel.json_body)
|
self.assertEqual(HTTPStatus.OK, channel.code, msg=channel.json_body)
|
||||||
|
|
Loading…
Reference in New Issue