@@ -25,20 +25,44 @@ defmodule ExICE.Priv.Candidate.Relay do
2525
2626 @ impl true
2727 def send_data ( cand , dst_ip , dst_port , data ) do
28- if MapSet . member? ( cand . client . permissions , dst_ip ) do
29- { :send , turn_addr , data , client } = ExTURN.Client . send ( cand . client , { dst_ip , dst_port } , data )
30- cand = % { cand | client: client }
31- do_send ( cand , turn_addr , data )
32- else
33- { :send , turn_addr , turn_data , client } = ExTURN.Client . create_permission ( cand . client , dst_ip )
34-
35- cand = % {
36- cand
37- | client: client ,
38- buffered_packets: [ { dst_ip , dst_port , data } | cand . buffered_packets ]
39- }
40-
41- do_send ( cand , turn_addr , turn_data )
28+ permission = ExTURN.Client . has_permission? ( cand . client , dst_ip )
29+ channel = ExTURN.Client . has_channel? ( cand . client , dst_ip , dst_port )
30+
31+ case { permission , channel } do
32+ { true , true } ->
33+ { :send , turn_addr , data , client } =
34+ ExTURN.Client . send ( cand . client , { dst_ip , dst_port } , data )
35+
36+ cand = % { cand | client: client }
37+ do_send ( cand , turn_addr , data )
38+
39+ { true , false } ->
40+ { :send , turn_addr , data , client } =
41+ ExTURN.Client . send ( cand . client , { dst_ip , dst_port } , data )
42+
43+ cand = % { cand | client: client }
44+
45+ case ExTURN.Client . create_channel ( cand . client , dst_ip , dst_port ) do
46+ { :ok , client } ->
47+ cand = % { cand | client: client }
48+ do_send ( cand , turn_addr , data )
49+
50+ { :send , ^ turn_addr , channel_data , client } ->
51+ cand = % { cand | client: client }
52+
53+ with { :ok , cand } <- do_send ( cand , turn_addr , data ) do
54+ do_send ( cand , turn_addr , channel_data )
55+ end
56+ end
57+
58+ { false , false } ->
59+ { :send , turn_addr , turn_data , client } =
60+ ExTURN.Client . create_permission ( cand . client , dst_ip )
61+
62+ buffered_data = [ { dst_ip , dst_port , data } | cand . buffered_packets ]
63+ cand = % { cand | client: client , buffered_packets: buffered_data }
64+
65+ do_send ( cand , turn_addr , turn_data )
4266 end
4367 end
4468
@@ -79,13 +103,12 @@ defmodule ExICE.Priv.Candidate.Relay do
79103 defp do_send_buffered_packets ( cand , [ ] ) , do: { :ok , cand }
80104
81105 defp do_send_buffered_packets ( cand , [ { dst_ip , dst_port , packet } | packets ] ) do
82- { :send , turn_addr , data , client } = ExTURN.Client . send ( cand . client , { dst_ip , dst_port } , packet )
83-
84- cand = % { cand | client: client }
106+ case send_data ( cand , dst_ip , dst_port , packet ) do
107+ { :ok , cand } ->
108+ do_send_buffered_packets ( cand , packets )
85109
86- case do_send ( cand , turn_addr , data ) do
87- { :ok , cand } -> do_send_buffered_packets ( cand , packets )
88- { :error , _reason , _cand } = error -> error
110+ { :error , _reaons , _cand } = error ->
111+ error
89112 end
90113 end
91114
0 commit comments