Skip to content

Commit afa1851

Browse files
authored
Handle ExDTLS errors (#60)
1 parent 9842026 commit afa1851

File tree

5 files changed

+42
-32
lines changed

5 files changed

+42
-32
lines changed

examples/echo/example.exs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,15 @@ defmodule Peer do
1212
ICECandidate,
1313
PeerConnection,
1414
MediaStreamTrack,
15-
SessionDescription,
16-
RTPTransceiver
15+
SessionDescription
1716
}
1817

1918
@ice_servers [
2019
%{urls: "stun:stun.l.google.com:19302"}
2120
]
2221

23-
def start_link() do
24-
GenServer.start_link(__MODULE__, nil)
22+
def start() do
23+
GenServer.start(__MODULE__, nil)
2524
end
2625

2726
@impl true
@@ -189,12 +188,12 @@ defmodule Peer do
189188
end
190189
end
191190

192-
{:ok, pid} = Peer.start_link()
191+
{:ok, pid} = Peer.start()
193192
ref = Process.monitor(pid)
194193

195194
receive do
196-
{:DOWN, ^ref, _, _, _} ->
197-
Logger.info("Peer process closed. Exiting")
195+
{:DOWN, ^ref, _, _, reason} ->
196+
Logger.info("Peer process closed, reason: #{inspect(reason)}. Exiting")
198197

199198
other ->
200199
Logger.warning("Unexpected msg. Exiting. Msg: #{inspect(other)}")

examples/save_to_file/example.exs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ defmodule Peer do
2323
%{urls: "stun:stun.l.google.com:19302"}
2424
]
2525

26-
def start_link() do
27-
GenServer.start_link(__MODULE__, nil)
26+
def start() do
27+
GenServer.start(__MODULE__, nil)
2828
end
2929

3030
@impl true
@@ -135,9 +135,9 @@ defmodule Peer do
135135

136136
defp handle_ws_message(%{"type" => "peer_left"}, state) do
137137
# in real scenario you should probably close the PeerConnection explicitly
138-
Ogg.Writer.close(state.ogg_writer)
139-
IVF.Writer.close(state.ivf_writer)
140138
Logger.info("Remote peer left. Closing files and exiting.")
139+
if state.ogg_writer, do: Ogg.Writer.close(state.ogg_writer)
140+
if state.ivf_writer, do: IVF.Writer.close(state.ivf_writer)
141141
exit(:normal)
142142
end
143143

@@ -217,12 +217,12 @@ defmodule Peer do
217217
end
218218
end
219219

220-
{:ok, pid} = Peer.start_link()
220+
{:ok, pid} = Peer.start()
221221
ref = Process.monitor(pid)
222222

223223
receive do
224-
{:DOWN, ^ref, _, _, _} ->
225-
Logger.info("Peer process closed. Exiting")
224+
{:DOWN, ^ref, _, _, reason} ->
225+
Logger.info("Peer process closed, reason: #{inspect(reason)}. Exiting")
226226

227227
other ->
228228
Logger.warning("Unexpected msg. Exiting. Msg: #{inspect(other)}")

examples/save_to_file/example.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
<main>
1313
<h1>Elixir WebRTC Save to File Example</h1>
1414
</main>
15-
<button id="button" >Start</button>
15+
<button id="button">Start</button>
1616
<video id="videoPlayer" autoplay muted></video>
1717
<script src="example.js"></script>
1818
</body>
1919

20-
</html>
20+
</html>

examples/send_from_file/example.exs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ defmodule Peer do
2929
%{urls: "stun:stun.l.google.com:19302"}
3030
]
3131

32-
def start_link() do
33-
GenServer.start_link(__MODULE__, nil)
32+
def start() do
33+
GenServer.start(__MODULE__, nil)
3434
end
3535

3636
@impl true
@@ -269,12 +269,12 @@ defmodule Peer do
269269
end
270270
end
271271

272-
{:ok, pid} = Peer.start_link()
272+
{:ok, pid} = Peer.start()
273273
ref = Process.monitor(pid)
274274

275275
receive do
276-
{:DOWN, ^ref, _, _, _} ->
277-
Logger.info("Peer process closed. Exiting")
276+
{:DOWN, ^ref, _, _, reason} ->
277+
Logger.info("Peer process closed, reason: #{inspect(reason)}. Exiting")
278278

279279
other ->
280280
Logger.warning("Unexpected msg. Exiting. Msg: #{inspect(other)}")

lib/ex_webrtc/dtls_transport.ex

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,11 @@ defmodule ExWebRTC.DTLSTransport do
208208

209209
@impl true
210210
def handle_info({:ex_ice, _from, {:data, _data} = msg}, state) do
211-
state = handle_ice_data(msg, state)
212-
{:noreply, state}
211+
case handle_ice_data(msg, state) do
212+
{:ok, state} -> {:noreply, state}
213+
# we use shutdown to avoid logging an error
214+
{:error, reason} -> {:stop, {:shutdown, reason}, state}
215+
end
213216
end
214217

215218
@impl true
@@ -224,12 +227,12 @@ defmodule ExWebRTC.DTLSTransport do
224227
end
225228

226229
defp handle_ice_data({:data, <<f, _rest::binary>> = data}, state) when f in 20..64 do
227-
# TODO: handle {:connection_closed, _}
228230
case ExDTLS.handle_data(state.dtls, data) do
229231
{:handshake_packets, packets, timeout} when state.ice_connected ->
230232
:ok = state.ice_transport.send_data(state.ice_pid, packets)
231233
Process.send_after(self(), :dtls_timeout, timeout)
232-
update_dtls_state(state, :connecting)
234+
state = update_dtls_state(state, :connecting)
235+
{:ok, state}
233236

234237
{:handshake_packets, packets, timeout} ->
235238
Logger.debug("""
@@ -239,7 +242,8 @@ defmodule ExWebRTC.DTLSTransport do
239242

240243
Process.send_after(self(), :dtls_timeout, timeout)
241244
state = %{state | buffered_packets: packets}
242-
update_dtls_state(state, :connecting)
245+
state = update_dtls_state(state, :connecting)
246+
{:ok, state}
243247

244248
{:handshake_finished, lkm, rkm, profile, packets} ->
245249
Logger.debug("DTLS handshake finished")
@@ -253,19 +257,26 @@ defmodule ExWebRTC.DTLSTransport do
253257

254258
if peer_fingerprint == state.peer_fingerprint do
255259
:ok = setup_srtp(state, lkm, rkm, profile)
256-
update_dtls_state(state, :connected)
260+
state = update_dtls_state(state, :connected)
261+
{:ok, state}
257262
else
258263
Logger.debug("Non-matching peer cert fingerprint.")
259-
update_dtls_state(state, :failed)
264+
state = update_dtls_state(state, :failed)
265+
{:ok, state}
260266
end
261267

262268
{:handshake_finished, lkm, rkm, profile} ->
263269
Logger.debug("DTLS handshake finished")
264270
:ok = setup_srtp(state, lkm, rkm, profile)
265-
update_dtls_state(state, :connected)
271+
state = update_dtls_state(state, :connected)
272+
{:ok, state}
266273

267274
:handshake_want_read ->
268-
state
275+
{:ok, state}
276+
277+
{:error, reason} = error ->
278+
Logger.debug("DTLS error: #{reason}")
279+
error
269280
end
270281
end
271282

@@ -285,15 +296,15 @@ defmodule ExWebRTC.DTLSTransport do
285296
Logger.error("Failed to decrypt SRTP/SRTCP, reason: #{inspect(reason)}")
286297
end
287298

288-
state
299+
{:ok, state}
289300
end
290301

291302
defp handle_ice_data({:data, _data}, state) do
292303
Logger.warning(
293304
"Received RTP/RTCP packets, but DTLS handshake hasn't been finished yet. Ignoring."
294305
)
295306

296-
state
307+
{:ok, state}
297308
end
298309

299310
defp setup_srtp(state, local_keying_material, remote_keying_material, profile) do

0 commit comments

Comments
 (0)