@@ -123,7 +123,7 @@ defmodule ExWebRTC.PeerConnection do
123123 peer_connection ( ) ,
124124 RTPTransceiver . id ( ) ,
125125 RTPTransceiver . direction ( )
126- ) :: :ok
126+ ) :: :ok | { :error , :invalid_transceiver_id }
127127 def set_transceiver_direction ( peer_connection , transceiver_id , direction )
128128 when direction in [ :sendrecv , :sendonly , :recvonly , :inactive ] do
129129 GenServer . call ( peer_connection , { :set_transceiver_direction , transceiver_id , direction } )
@@ -134,7 +134,7 @@ defmodule ExWebRTC.PeerConnection do
134134 GenServer . call ( peer_connection , { :add_track , track } )
135135 end
136136
137- @ spec remove_track ( peer_connection ( ) , RTPSender . id ( ) ) :: :ok
137+ @ spec remove_track ( peer_connection ( ) , RTPSender . id ( ) ) :: :ok | { :error , :invalid_sender_id }
138138 def remove_track ( peer_connection , sender_id ) do
139139 GenServer . call ( peer_connection , { :remove_track , sender_id } )
140140 end
@@ -366,7 +366,7 @@ defmodule ExWebRTC.PeerConnection do
366366
367367 case idx do
368368 nil ->
369- { :reply , :ok , state }
369+ { :reply , { :error , :invalid_transceiver_id } , state }
370370
371371 idx ->
372372 tr = Enum . at ( state . transceivers , idx )
@@ -438,16 +438,18 @@ defmodule ExWebRTC.PeerConnection do
438438 @ impl true
439439 def handle_call ( { :remove_track , sender_id } , _from , state ) do
440440 tr_idx =
441- Enum . find_index ( state . transceivers , fn tr ->
442- tr . sender . track != nil and tr . sender . id == sender_id
443- end )
441+ state . transceivers
442+ |> Stream . with_index ( )
443+ |> Enum . find ( fn { tr , _idx } -> tr . sender . id == sender_id end )
444444
445445 case tr_idx do
446446 nil ->
447+ { :reply , { :error , :invalid_sender_id } , state }
448+
449+ { tr , _idx } when tr . sender . track == nil ->
447450 { :reply , :ok , state }
448451
449- idx ->
450- tr = Enum . at ( state . transceivers , idx )
452+ { tr , idx } ->
451453 sender = % RTPSender { tr . sender | track: nil }
452454
453455 direction =
@@ -585,8 +587,7 @@ defmodule ExWebRTC.PeerConnection do
585587 state . ice_transport . gather_candidates ( state . ice_pid )
586588 end
587589
588- # See W3C WebRTC 4.4.1.5 when "description"
589- # is not of type "rollback" and "remote" is false.
590+ # See W3C WebRTC 4.4.1.5-4.7.10.1
590591 # Consider scenario where the remote side offers
591592 # sendonly and we want to reject it by setting
592593 # transceiver's direction to inactive after SRD.
@@ -768,25 +769,25 @@ defmodule ExWebRTC.PeerConnection do
768769 Enum . reduce ( sdp . media , state . transceivers , fn mline , transceivers ->
769770 { :mid , mid } = ExSDP . get_attribute ( mline , :mid )
770771
772+ direction = SDPUtils . get_media_direction ( mline ) |> reverse_direction ( )
773+
771774 # TODO: consider recycled transceivers
772775 case find_transceiver ( transceivers , mid ) do
773776 { idx , % RTPTransceiver { } = tr } ->
774777 new_tr = RTPTransceiver . update ( tr , mline , state . config )
775- new_tr = process_remote_track ( new_tr , mline , state . owner )
778+ new_tr = process_remote_track ( new_tr , direction , state . owner )
776779 List . replace_at ( transceivers , idx , new_tr )
777780
778781 nil ->
779782 new_tr = RTPTransceiver . from_mline ( mline , state . config )
780- new_tr = process_remote_track ( new_tr , mline , state . owner )
783+ new_tr = process_remote_track ( new_tr , direction , state . owner )
781784 transceivers ++ [ new_tr ]
782785 end
783786 end )
784787 end
785788
786789 # see W3C WebRTC 5.1.1
787- defp process_remote_track ( transceiver , mline , owner ) do
788- direction = SDPUtils . get_media_direction ( mline )
789-
790+ defp process_remote_track ( transceiver , direction , owner ) do
790791 cond do
791792 direction in [ :sendrecv , :recvonly ] and
792793 transceiver . fired_direction not in [ :sendrecv , :recvonly ] ->
0 commit comments