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

Commit 367f73e

Browse files
committed
Include thread information when sending receipts over federation.
1 parent 618e4ab commit 367f73e

File tree

3 files changed

+48
-3
lines changed

3 files changed

+48
-3
lines changed

synapse/federation/sender/per_destination_queue.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
from synapse.logging.opentracing import SynapseTags, set_tag
3636
from synapse.metrics import sent_transactions_counter
3737
from synapse.metrics.background_process_metrics import run_as_background_process
38-
from synapse.types import ReadReceipt
38+
from synapse.types import JsonDict, ReadReceipt
3939
from synapse.util.retryutils import NotRetryingDestination, get_retry_limiter
4040
from synapse.visibility import filter_events_for_server
4141

@@ -202,9 +202,12 @@ def queue_read_receipt(self, receipt: ReadReceipt) -> None:
202202
Args:
203203
receipt: receipt to be queued
204204
"""
205+
serialized_receipt: JsonDict = {"event_ids": receipt.event_ids, "data": receipt.data}
206+
if receipt.thread_id is not None:
207+
serialized_receipt["data"]["thread_id"] = receipt.thread_id
205208
self._pending_rrs.setdefault(receipt.room_id, {}).setdefault(
206209
receipt.receipt_type, {}
207-
)[receipt.user_id] = {"event_ids": receipt.event_ids, "data": receipt.data}
210+
)[receipt.user_id] = serialized_receipt
208211

209212
def flush_read_receipts_for_room(self, room_id: str) -> None:
210213
# if we don't have any read-receipts for this room, it may be that we've already

synapse/handlers/receipts.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ async def _received_remote_receipt(self, origin: str, content: JsonDict) -> None
9292
continue
9393

9494
# Check if these receipts apply to a thread.
95-
thread_id = None
9695
data = user_values.get("data", {})
9796
thread_id = data.get("thread_id")
9897
# If the thread ID is invalid, consider it missing.

tests/federation/test_federation_sender.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,49 @@ def test_send_receipts(self):
8383
],
8484
)
8585

86+
@override_config({"send_federation": True})
87+
def test_send_receipts_thread(self):
88+
mock_send_transaction = (
89+
self.hs.get_federation_transport_client().send_transaction
90+
)
91+
mock_send_transaction.return_value = make_awaitable({})
92+
93+
sender = self.hs.get_federation_sender()
94+
receipt = ReadReceipt(
95+
"room_id",
96+
"m.read",
97+
"user_id",
98+
["event_id"],
99+
thread_id="thread_id",
100+
data={"ts": 1234},
101+
)
102+
self.successResultOf(defer.ensureDeferred(sender.send_read_receipt(receipt)))
103+
104+
self.pump()
105+
106+
# expect a call to send_transaction
107+
mock_send_transaction.assert_called_once()
108+
json_cb = mock_send_transaction.call_args[0][1]
109+
data = json_cb()
110+
self.assertEqual(
111+
data["edus"],
112+
[
113+
{
114+
"edu_type": EduTypes.RECEIPT,
115+
"content": {
116+
"room_id": {
117+
"m.read": {
118+
"user_id": {
119+
"event_ids": ["event_id"],
120+
"data": {"ts": 1234, "thread_id": "thread_id"},
121+
}
122+
}
123+
}
124+
},
125+
}
126+
],
127+
)
128+
86129
@override_config({"send_federation": True})
87130
def test_send_receipts_with_backoff(self):
88131
"""Send two receipts in quick succession; the second should be flushed, but

0 commit comments

Comments
 (0)