aboutsummaryrefslogtreecommitdiff
path: root/federationapi
diff options
context:
space:
mode:
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