aboutsummaryrefslogtreecommitdiff
path: root/federationapi
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2020-06-01 17:50:19 +0100
committerGitHub <noreply@github.com>2020-06-01 17:50:19 +0100
commita5d822004dd93d6f6a7ed73371aeb4bfb163b5ba (patch)
tree76b10a79094415e45cfe5f2db9dfdf58cf0d2837 /federationapi
parent1f43c24f8602dfbc95620e9d34fac78a7b449c11 (diff)
Send-to-device support (#1072)
* Groundwork for send-to-device messaging * Update sample config * Add unstable routing for now * Send to device consumer in sync API * Start the send-to-device consumer * fix indentation in dendrite-config.yaml * Create send-to-device database tables, other tweaks * Add some logic for send-to-device messages, add them into sync stream * Handle incoming send-to-device messages, count them with EDU stream pos * Undo changes to test * pq.Array * Fix sync * Logging * Fix a couple of transaction things, fix client API * Add send-to-device test, hopefully fix bugs * Comments * Refactor a bit * Fix schema * Fix queries * Debug logging * Fix storing and retrieving of send-to-device messages * Try to avoid database locks * Update sync position * Use latest sync position * Jiggle about sync a bit * Fix tests * Break out the retrieval from the update/delete behaviour * Comments * nolint on getResponseWithPDUsForCompleteSync * Try to line up sync tokens again * Implement wildcard * Add all send-to-device tests to whitelist, what could possibly go wrong? * Only care about wildcard when targeted locally * Deduplicate transactions * Handle tokens properly, return immediately if waiting send-to-device messages * Fix sync * Update sytest-whitelist * Fix copyright notice (need to do more of this) * Comments, copyrights * Return errors from Do, fix dendritejs * Review comments * Comments * Constructor for TransactionWriter * defletions * Update gomatrixserverlib, sytest-blacklist
Diffstat (limited to 'federationapi')
-rw-r--r--federationapi/routing/send.go19
-rw-r--r--federationapi/routing/send_test.go8
2 files changed, 27 insertions, 0 deletions
diff --git a/federationapi/routing/send.go b/federationapi/routing/send.go
index b514af0a..74b4c014 100644
--- a/federationapi/routing/send.go
+++ b/federationapi/routing/send.go
@@ -265,6 +265,25 @@ func (t *txnReq) processEDUs(edus []gomatrixserverlib.EDU) {
if err := t.eduProducer.SendTyping(t.context, typingPayload.UserID, typingPayload.RoomID, typingPayload.Typing, 30*1000); err != nil {
util.GetLogger(t.context).WithError(err).Error("Failed to send typing event to edu server")
}
+ case gomatrixserverlib.MDirectToDevice:
+ // https://matrix.org/docs/spec/server_server/r0.1.3#m-direct-to-device-schema
+ var directPayload gomatrixserverlib.ToDeviceMessage
+ if err := json.Unmarshal(e.Content, &directPayload); err != nil {
+ util.GetLogger(t.context).WithError(err).Error("Failed to unmarshal send-to-device events")
+ continue
+ }
+ for userID, byUser := range directPayload.Messages {
+ for deviceID, message := range byUser {
+ // TODO: check that the user and the device actually exist here
+ if err := t.eduProducer.SendToDevice(t.context, directPayload.Sender, userID, deviceID, directPayload.Type, message); err != nil {
+ util.GetLogger(t.context).WithError(err).WithFields(logrus.Fields{
+ "sender": directPayload.Sender,
+ "user_id": userID,
+ "device_id": deviceID,
+ }).Error("Failed to send send-to-device event to edu server")
+ }
+ }
+ }
default:
util.GetLogger(t.context).WithField("type", e.Type).Warn("unhandled edu")
}
diff --git a/federationapi/routing/send_test.go b/federationapi/routing/send_test.go
index cb8aec6f..3e28a347 100644
--- a/federationapi/routing/send_test.go
+++ b/federationapi/routing/send_test.go
@@ -77,6 +77,14 @@ func (p *testEDUProducer) InputTypingEvent(
return nil
}
+func (p *testEDUProducer) InputSendToDeviceEvent(
+ ctx context.Context,
+ request *eduAPI.InputSendToDeviceEventRequest,
+ response *eduAPI.InputSendToDeviceEventResponse,
+) error {
+ return nil
+}
+
type testRoomserverAPI struct {
inputRoomEvents []api.InputRoomEvent
queryStateAfterEvents func(*api.QueryStateAfterEventsRequest) api.QueryStateAfterEventsResponse