Skip to content

Commit 5173741

Browse files
authored
Support MSC4140: Delayed events (Futures) (#17326)
1 parent 75e2c17 commit 5173741

21 files changed

Lines changed: 1772 additions & 12 deletions

File tree

changelog.d/17326.feature

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Add initial implementation of delayed events as proposed by [MSC4140](https://github.com/matrix-org/matrix-spec-proposals/pull/4140).
2+

docker/complement/conf/workers-shared-extra.yaml.j2

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@ server_notices:
111111
system_mxid_avatar_url: ""
112112
room_name: "Server Alert"
113113

114+
# Enable delayed events (msc4140)
115+
max_event_delay_duration: 24h
116+
114117

115118
# Disable sync cache so that initial `/sync` requests are up-to-date.
116119
caches:

docs/usage/configuration/config_documentation.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,19 @@ email:
761761
password_reset: "[%(server_name)s] Password reset"
762762
email_validation: "[%(server_name)s] Validate your email"
763763
```
764+
---
765+
### `max_event_delay_duration`
766+
767+
The maximum allowed duration by which sent events can be delayed, as per
768+
[MSC4140](https://github.com/matrix-org/matrix-spec-proposals/pull/4140).
769+
Must be a positive value if set.
770+
771+
Defaults to no duration (`null`), which disallows sending delayed events.
772+
773+
Example configuration:
774+
```yaml
775+
max_event_delay_duration: 24h
776+
```
764777

765778
## Homeserver blocking
766779
Useful options for Synapse admins.

docs/workers.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ information.
290290
Additionally, the following REST endpoints can be handled for GET requests:
291291

292292
^/_matrix/client/(api/v1|r0|v3|unstable)/pushrules/
293+
^/_matrix/client/unstable/org.matrix.msc4140/delayed_events
293294

294295
Pagination requests can also be handled, but all requests for a given
295296
room must be routed to the same instance. Additionally, care must be taken to

scripts-dev/complement.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@ test_packages=(
223223
./tests/msc3930
224224
./tests/msc3902
225225
./tests/msc3967
226+
./tests/msc4140
226227
)
227228

228229
# Enable dirty runs, so tests will reuse the same container where possible.

synapse/app/generic_worker.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
)
6666
from synapse.storage.databases.main.censor_events import CensorEventsStore
6767
from synapse.storage.databases.main.client_ips import ClientIpWorkerStore
68+
from synapse.storage.databases.main.delayed_events import DelayedEventsStore
6869
from synapse.storage.databases.main.deviceinbox import DeviceInboxWorkerStore
6970
from synapse.storage.databases.main.devices import DeviceWorkerStore
7071
from synapse.storage.databases.main.directory import DirectoryWorkerStore
@@ -161,6 +162,7 @@ class GenericWorkerStore(
161162
TaskSchedulerWorkerStore,
162163
ExperimentalFeaturesStore,
163164
SlidingSyncStore,
165+
DelayedEventsStore,
164166
):
165167
# Properties that multiple storage classes define. Tell mypy what the
166168
# expected type is.

synapse/config/server.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# This file is licensed under the Affero General Public License (AGPL) version 3.
33
#
44
# Copyright 2014-2021 The Matrix.org Foundation C.I.C.
5-
# Copyright (C) 2023 New Vector, Ltd
5+
# Copyright (C) 2023-2024 New Vector, Ltd
66
#
77
# This program is free software: you can redistribute it and/or modify
88
# it under the terms of the GNU Affero General Public License as
@@ -780,6 +780,17 @@ def read_config(self, config: JsonDict, **kwargs: Any) -> None:
780780
else:
781781
self.delete_stale_devices_after = None
782782

783+
# The maximum allowed delay duration for delayed events (MSC4140).
784+
max_event_delay_duration = config.get("max_event_delay_duration")
785+
if max_event_delay_duration is not None:
786+
self.max_event_delay_ms: Optional[int] = self.parse_duration(
787+
max_event_delay_duration
788+
)
789+
if self.max_event_delay_ms <= 0:
790+
raise ConfigError("max_event_delay_duration must be a positive value")
791+
else:
792+
self.max_event_delay_ms = None
793+
783794
def has_tls_listener(self) -> bool:
784795
return any(listener.is_tls() for listener in self.listeners)
785796

0 commit comments

Comments
 (0)