@@ -21,11 +21,10 @@ import (
2121 "log"
2222 "time"
2323
24+ "github.com/pion/webrtc/v3"
2425 "maunium.net/go/mautrix"
2526 "maunium.net/go/mautrix/event"
2627 "maunium.net/go/mautrix/id"
27-
28- "github.com/pion/webrtc/v3"
2928)
3029
3130type Call struct {
@@ -53,10 +52,12 @@ func (c *Call) onDCSelect(start []event.SFUTrackDescription) {
5352 StreamID : trackDesc .StreamID ,
5453 TrackID : trackDesc .TrackID ,
5554 })
55+
5656 if len (foundTracks ) == 0 {
5757 log .Printf ("%s | no track found StreamID %s TrackID %s" , c .UserID , trackDesc .StreamID , trackDesc .TrackID )
5858 continue
5959 }
60+
6061 for _ , track := range foundTracks {
6162 if _ , err := c .PeerConnection .AddTrack (track ); err == nil {
6263 log .Printf ("%s | added %s StreamID %s TrackID %s" , c .UserID , track .Kind (), track .StreamID (), track .ID ())
@@ -84,6 +85,7 @@ func (c *Call) onDCPublish(sdp string) {
8485 log .Printf ("%s | failed to create answer - ignoring: %s" , c .UserID , err )
8586 return
8687 }
88+
8789 err = c .PeerConnection .SetLocalDescription (offer )
8890 if err != nil {
8991 log .Printf ("%s | failed to set local description %+v - ignoring: %s" , c .UserID , offer .SDP , err )
@@ -99,13 +101,13 @@ func (c *Call) onDCPublish(sdp string) {
99101func (c * Call ) onDCUnpublish (stop []event.SFUTrackDescription , sdp string ) {
100102 for _ , trackDesc := range stop {
101103 log .Printf ("%s | unpublishing StreamID %s TrackID %s" , c .UserID , trackDesc .StreamID , trackDesc .TrackID )
104+
102105 if removedTracksCount := c .Conf .RemoveTracksFromPeerConnectionsByInfo (LocalTrackInfo {
103106 StreamID : trackDesc .StreamID ,
104107 TrackID : trackDesc .TrackID ,
105108 }); removedTracksCount == 0 {
106109 log .Printf ("%s | no tracks to remove for: %+v" , c .UserID , stop )
107110 }
108-
109111 }
110112
111113 err := c .PeerConnection .SetRemoteDescription (webrtc.SessionDescription {
@@ -122,6 +124,7 @@ func (c *Call) onDCUnpublish(stop []event.SFUTrackDescription, sdp string) {
122124 log .Printf ("%s | failed to create answer - ignoring: %s" , c .UserID , err )
123125 return
124126 }
127+
125128 err = c .PeerConnection .SetLocalDescription (offer )
126129 if err != nil {
127130 log .Printf ("%s | failed to set local description %+v - ignoring: %s" , c .UserID , offer .SDP , err )
@@ -149,34 +152,33 @@ func (c *Call) onDCAnswer(sdp string) {
149152
150153func (c * Call ) onDCAlive () {
151154 c .lastKeepAliveTimestamp = time .Now ()
152-
153155}
154156
155- func (c * Call ) onDCMetadata (metadata event. CallSDPStreamMetadata ) {
157+ func (c * Call ) onDCMetadata () {
156158 log .Printf ("%s | received DC metadata" , c .UserID )
157159
158160 c .Conf .SendUpdatedMetadataFromCall (c .CallID )
159161}
160162
161- func (c * Call ) dataChannelHandler (d * webrtc.DataChannel ) {
162- c .dataChannel = d
163+ func (c * Call ) dataChannelHandler (channel * webrtc.DataChannel ) {
164+ c .dataChannel = channel
163165
164- d .OnOpen (func () {
166+ channel .OnOpen (func () {
165167 c .SendDataChannelMessage (event.SFUMessage {Op : event .SFUOperationMetadata })
166168 })
167169
168- d .OnError (func (err error ) {
170+ channel .OnError (func (err error ) {
169171 log .Fatalf ("%s | DC error: %s" , c .CallID , err )
170172 })
171173
172- d .OnMessage (func (m webrtc.DataChannelMessage ) {
173- if ! m .IsString {
174- log .Printf ("%s | inbound message is not string - ignoring: %+v" , c .UserID , m )
174+ channel .OnMessage (func (marshaledMsg webrtc.DataChannelMessage ) {
175+ if ! marshaledMsg .IsString {
176+ log .Printf ("%s | inbound message is not string - ignoring: %+v" , c .UserID , marshaledMsg )
175177 return
176178 }
177179
178180 msg := & event.SFUMessage {}
179- if err := json .Unmarshal (m .Data , msg ); err != nil {
181+ if err := json .Unmarshal (marshaledMsg .Data , msg ); err != nil {
180182 log .Printf ("%s | failed to unmarshal %+v - ignoring: %s" , c .CallID , msg , err )
181183 return
182184 }
@@ -197,7 +199,7 @@ func (c *Call) dataChannelHandler(d *webrtc.DataChannel) {
197199 case event .SFUOperationAlive :
198200 c .onDCAlive ()
199201 case event .SFUOperationMetadata :
200- c .onDCMetadata (msg . Metadata )
202+ c .onDCMetadata ()
201203
202204 default :
203205 log .Printf ("Unknown operation - ignoring: %s" , msg .Op )
@@ -217,7 +219,9 @@ func (c *Call) negotiationNeededHandler() {
217219 log .Printf ("%s | failed to create offer - ignoring: %s" , c .UserID , err )
218220 return
219221 }
222+
220223 err = c .PeerConnection .SetLocalDescription (offer )
224+
221225 if err != nil {
222226 log .Printf ("%s | failed to set local description %+v - ignoring: %s" , c .UserID , offer .SDP , err )
223227 return
@@ -257,12 +261,22 @@ func (c *Call) iceCandidateHandler(candidate *webrtc.ICECandidate) {
257261 c .sendToDevice (event .CallCandidates , candidateEvtContent )
258262}
259263
260- func (c * Call ) trackHandler (trackRemote * webrtc.TrackRemote , rec * webrtc. RTPReceiver ) {
264+ func (c * Call ) trackHandler (trackRemote * webrtc.TrackRemote ) {
261265 go WriteRTCP (trackRemote , c .PeerConnection )
262266
263- trackLocal , err := webrtc .NewTrackLocalStaticRTP (trackRemote .Codec ().RTPCodecCapability , trackRemote .ID (), trackRemote .StreamID ())
267+ trackLocal , err := webrtc .NewTrackLocalStaticRTP (
268+ trackRemote .Codec ().RTPCodecCapability ,
269+ trackRemote .ID (),
270+ trackRemote .StreamID (),
271+ )
264272 if err != nil {
265- log .Printf ("%s | failed to create new track local static RTP %+v - ignoring: %s" , c .UserID , trackRemote .Codec ().RTPCodecCapability , err )
273+ log .Printf (
274+ "%s | failed to create new track local static RTP %+v - ignoring: %s" ,
275+ c .UserID ,
276+ trackRemote .Codec ().RTPCodecCapability ,
277+ err ,
278+ )
279+
266280 return
267281 }
268282
@@ -277,7 +291,13 @@ func (c *Call) trackHandler(trackRemote *webrtc.TrackRemote, rec *webrtc.RTPRece
277291 })
278292 c .Conf .Tracks .Mutex .Unlock ()
279293
280- log .Printf ("%s | published %s StreamID %s TrackID %s" , c .UserID , trackLocal .Kind (), trackLocal .StreamID (), trackLocal .ID ())
294+ log .Printf (
295+ "%s | published %s StreamID %s TrackID %s" ,
296+ c .UserID ,
297+ trackLocal .Kind (),
298+ trackLocal .StreamID (),
299+ trackLocal .ID (),
300+ )
281301
282302 go c .Conf .SendUpdatedMetadataFromCall (c .CallID )
283303 go CopyRemoteToLocal (trackRemote , trackLocal )
@@ -317,10 +337,11 @@ func (c *Call) OnInvite(content *event.CallInviteEventContent) {
317337 if err != nil {
318338 log .Panicf ("%s | failed to create new peer connection: %s" , c .UserID , err )
319339 }
340+
320341 c .PeerConnection = peerConnection
321342
322343 peerConnection .OnTrack (func (track * webrtc.TrackRemote , receiver * webrtc.RTPReceiver ) {
323- c .trackHandler (track , receiver )
344+ c .trackHandler (track )
324345 })
325346 peerConnection .OnDataChannel (func (d * webrtc.DataChannel ) {
326347 c .dataChannelHandler (d )
@@ -352,10 +373,12 @@ func (c *Call) OnInvite(content *event.CallInviteEventContent) {
352373
353374 // TODO: trickle ICE for fast conn setup, rather than block here
354375 gatherComplete := webrtc .GatheringCompletePromise (peerConnection )
376+
355377 if err = peerConnection .SetLocalDescription (answer ); err != nil {
356378 log .Printf ("%s | failed to set local description %+v - ignoring: %s" , c .UserID , offer .SDP , err )
357379 return
358380 }
381+
359382 <- gatherComplete
360383
361384 answerEvtContent := & event.Content {
@@ -387,7 +410,7 @@ func (c *Call) OnSelectAnswer(content *event.CallSelectAnswerEventContent) {
387410 }
388411}
389412
390- func (c * Call ) OnHangup (content * event. CallHangupEventContent ) {
413+ func (c * Call ) OnHangup () {
391414 c .Terminate ()
392415}
393416
@@ -400,6 +423,7 @@ func (c *Call) OnCandidates(content *event.CallCandidatesEventContent) {
400423 SDPMLineIndex : & sdpMLineIndex ,
401424 UsernameFragment : new (string ),
402425 }
426+
403427 if err := c .PeerConnection .AddICECandidate (ice ); err != nil {
404428 log .Printf ("%s | failed to add ICE candidate %+v: %s" , c .UserID , content , err )
405429 }
@@ -447,6 +471,7 @@ func (c *Call) sendToDevice(callType event.Type, content *event.Content) {
447471 if callType .Type != event .CallCandidates .Type {
448472 log .Printf ("%s | sending to device %s" , c .UserID , callType .Type )
449473 }
474+
450475 toDevice := & mautrix.ReqSendToDevice {
451476 Messages : map [id.UserID ]map [id.DeviceID ]* event.Content {
452477 c .UserID : {
@@ -457,7 +482,9 @@ func (c *Call) sendToDevice(callType event.Type, content *event.Content) {
457482
458483 // TODO: E2EE
459484 // TODO: to-device reliability
460- c .Client .SendToDevice (callType , toDevice )
485+ if _ , err := c .Client .SendToDevice (callType , toDevice ); err != nil {
486+ log .Printf ("%s | error sending to-device %s: %s" , c .UserID , callType .Type , err )
487+ }
461488}
462489
463490func (c * Call ) SendDataChannelMessage (msg event.SFUMessage ) {
@@ -492,6 +519,7 @@ func (c *Call) CheckKeepAliveTimestamp() {
492519 log .Printf ("%s | did not get keep-alive message in the last %s:" , c .UserID , timeout )
493520 c .Hangup (event .CallHangupKeepAliveTimeout )
494521 }
522+
495523 break
496524 }
497525 }
0 commit comments