diff --git a/changelog.d/9850.feature b/changelog.d/9850.feature
new file mode 100644
index 0000000000..f56b0bb3bd
--- /dev/null
+++ b/changelog.d/9850.feature
@@ -0,0 +1 @@
+Add experimental support for handling presence on a worker.
diff --git a/synapse/federation/sender/__init__.py b/synapse/federation/sender/__init__.py
index 6266accaf5..b00a55324c 100644
--- a/synapse/federation/sender/__init__.py
+++ b/synapse/federation/sender/__init__.py
@@ -539,6 +539,10 @@ class FederationSender(AbstractFederationSender):
# No-op if presence is disabled.
return
+ # Ensure we only send out presence states for local users.
+ for state in states:
+ assert self.is_mine_id(state.user_id)
+
for destination in destinations:
if destination == self.server_name:
continue
diff --git a/synapse/handlers/presence.py b/synapse/handlers/presence.py
index 6460eb9952..bd2382193f 100644
--- a/synapse/handlers/presence.py
+++ b/synapse/handlers/presence.py
@@ -125,6 +125,7 @@ class BasePresenceHandler(abc.ABC):
self.store = hs.get_datastore()
self.presence_router = hs.get_presence_router()
self.state = hs.get_state_handler()
+ self.is_mine_id = hs.is_mine_id
self._federation = None
if hs.should_send_federation() or not hs.config.worker_app:
@@ -261,7 +262,8 @@ class BasePresenceHandler(abc.ABC):
self, states: List[UserPresenceState]
):
"""If this instance is a federation sender, send the states to all
- destinations that are interested.
+ destinations that are interested. Filters out any states for remote
+ users.
"""
if not self._send_federation:
@@ -270,6 +272,11 @@ class BasePresenceHandler(abc.ABC):
# If this worker sends federation we must have a FederationSender.
assert self._federation
+ states = [s for s in states if self.is_mine_id(s.user_id)]
+
+ if not states:
+ return
+
hosts_and_states = await get_interested_remotes(
self.store,
self.presence_router,
@@ -292,7 +299,6 @@ class WorkerPresenceHandler(BasePresenceHandler):
def __init__(self, hs):
super().__init__(hs)
self.hs = hs
- self.is_mine_id = hs.is_mine_id
self._presence_enabled = hs.config.use_presence
@@ -492,7 +498,6 @@ class PresenceHandler(BasePresenceHandler):
def __init__(self, hs: "HomeServer"):
super().__init__(hs)
self.hs = hs
- self.is_mine_id = hs.is_mine_id
self.server_name = hs.hostname
self.wheel_timer = WheelTimer()
self.notifier = hs.get_notifier()
|