MCPcopy Create free account
hub / github.com/daodst/chat / SendToDevice

Method SendToDevice

federationapi/producers/syncapi.go:63–133  ·  view source on GitHub ↗
(
	ctx context.Context, sender, userID, deviceID, eventType string,
	message interface{},
)

Source from the content-addressed store, hash-verified

61}
62
63func (p *SyncAPIProducer) SendToDevice(
64 ctx context.Context, sender, userID, deviceID, eventType string,
65 message interface{},
66) error {
67 devices := []string{}
68 _, domain, err := gomatrixserverlib.SplitID('@', userID)
69 if err != nil {
70 return err
71 }
72
73 // If the event is targeted locally then we want to expand the wildcard
74 // out into individual device IDs so that we can send them to each respective
75 // device. If the event isn't targeted locally then we can't expand the
76 // wildcard as we don't know about the remote devices, so instead we leave it
77 // as-is, so that the federation sender can send it on with the wildcard intact.
78 if domain == p.ServerName && deviceID == "*" {
79 var res userapi.QueryDevicesResponse
80 err = p.UserAPI.QueryDevices(context.TODO(), &userapi.QueryDevicesRequest{
81 UserID: userID,
82 }, &res)
83 if err != nil {
84 return err
85 }
86 for _, dev := range res.Devices {
87 devices = append(devices, dev.ID)
88 }
89 } else {
90 devices = append(devices, deviceID)
91 }
92
93 js, err := json.Marshal(message)
94 if err != nil {
95 return err
96 }
97
98 log.WithFields(log.Fields{
99 "user_id": userID,
100 "num_devices": len(devices),
101 "type": eventType,
102 }).Tracef("Producing to topic '%s'", p.TopicSendToDeviceEvent)
103 for _, device := range devices {
104 ote := &types.OutputSendToDeviceEvent{
105 UserID: userID,
106 DeviceID: device,
107 SendToDeviceEvent: gomatrixserverlib.SendToDeviceEvent{
108 Sender: sender,
109 Type: eventType,
110 Content: js,
111 },
112 }
113
114 eventJSON, err := json.Marshal(ote)
115 if err != nil {
116 log.WithError(err).Error("sendToDevice failed json.Marshal")
117 return err
118 }
119 m := &nats.Msg{
120 Subject: p.TopicSendToDeviceEvent,

Callers 1

processEDUsMethod · 0.45

Calls 5

PublishMsgMethod · 0.80
ContextMethod · 0.80
QueryDevicesMethod · 0.65
SetMethod · 0.65
ErrorMethod · 0.45

Tested by

no test coverage detected