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

Method SendToDevice

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

Source from the content-addressed store, hash-verified

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

Callers 2

testSendToDeviceFunction · 0.95
SendToDeviceFunction · 0.45

Calls 5

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

Tested by 1

testSendToDeviceFunction · 0.76