Skip to content

Commit

Permalink
Add get_stats/1 (#64)
Browse files Browse the repository at this point in the history
  • Loading branch information
mickel8 authored Feb 5, 2024
1 parent 8e3992e commit 57d04fc
Show file tree
Hide file tree
Showing 13 changed files with 579 additions and 37 deletions.
10 changes: 10 additions & 0 deletions lib/ex_webrtc/app.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
defmodule ExWebRTC.App do
@moduledoc false
use Application

@impl true
def start(_type, _args) do
children = [{Registry, keys: :unique, name: ExWebRTC.Registry}]
Supervisor.start_link(children, strategy: :one_for_one)
end
end
62 changes: 62 additions & 0 deletions lib/ex_webrtc/dtls_transport.ex
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,19 @@ defmodule ExWebRTC.DTLSTransport do
"""
@type dtls_state() :: :new | :connecting | :connected | :closed | :failed

@typedoc """
Information about DTLS certificate.
* `fingerprint` - hex dump of the cert fingerprint
* `fingerprint_algorithm` - always `:sha_256`
* `base64_certificate` - base 64 encoded certificate
"""
@type cert_info :: %{
fingerprint: binary(),
fingerprint_algorithm: :sha_256,
base64_certificate: binary()
}

@spec start_link(ICETransport.t(), pid()) :: GenServer.on_start()
def start_link(ice_transport \\ DefaultICETransport, ice_pid) do
behaviour = ice_transport.__info__(:attributes)[:behaviour] || []
Expand All @@ -49,6 +62,14 @@ defmodule ExWebRTC.DTLSTransport do
GenServer.call(dtls_transport, :set_ice_connected)
end

@spec get_certs_info(dtls_transport()) :: %{
local_cert_info: cert_info(),
remote_cert_info: cert_info() | nil
}
def get_certs_info(dtls_transport) do
GenServer.call(dtls_transport, :get_certs_info)
end

@spec get_fingerprint(dtls_transport()) :: binary()
def get_fingerprint(dtls_transport) do
GenServer.call(dtls_transport, :get_fingerprint)
Expand Down Expand Up @@ -87,8 +108,12 @@ defmodule ExWebRTC.DTLSTransport do
ice_connected: false,
buffered_packets: nil,
cert: cert,
base64_cert: Base.encode64(cert),
pkey: pkey,
fingerprint: fingerprint,
remote_cert: nil,
remote_base64_cert: nil,
remote_fingerprint: nil,
in_srtp: ExLibSRTP.new(),
out_srtp: ExLibSRTP.new(),
# sha256 hex dump
Expand Down Expand Up @@ -133,6 +158,33 @@ defmodule ExWebRTC.DTLSTransport do
end
end

@impl true
def handle_call(:get_certs_info, _from, state) do
local_cert_info = %{
fingerprint: Utils.hex_dump(state.fingerprint),
fingerprint_algorithm: :sha_256,
base64_certificate: state.base64_cert
}

remote_cert_info =
if state.dtls_state == :connected do
%{
fingerprint: Utils.hex_dump(state.remote_fingerprint),
fingerprint_algorithm: :sha_256,
base64_certificate: state.remote_base64_cert
}
else
nil
end

certs_info = %{
local_cert_info: local_cert_info,
remote_cert_info: remote_cert_info
}

{:reply, certs_info, state}
end

@impl true
def handle_call(:get_fingerprint, _from, state) do
{:reply, state.fingerprint, state}
Expand Down Expand Up @@ -247,6 +299,7 @@ defmodule ExWebRTC.DTLSTransport do

{:handshake_finished, lkm, rkm, profile, packets} ->
Logger.debug("DTLS handshake finished")
state = update_remote_cert_info(state)
state.ice_transport.send_data(state.ice_pid, packets)

peer_fingerprint =
Expand All @@ -269,6 +322,7 @@ defmodule ExWebRTC.DTLSTransport do
Logger.debug("DTLS handshake finished")
:ok = setup_srtp(state, lkm, rkm, profile)
state = update_dtls_state(state, :connected)
state = update_remote_cert_info(state)
{:ok, state}

:handshake_want_read ->
Expand Down Expand Up @@ -340,5 +394,13 @@ defmodule ExWebRTC.DTLSTransport do
%{state | dtls_state: new_dtls_state}
end

defp update_remote_cert_info(state) do
cert = ExDTLS.get_cert(state.dtls)
fingerprint = ExDTLS.get_cert_fingerprint(cert)
base64_cert = Base.encode64(cert)

%{state | remote_cert: cert, remote_base64_cert: base64_cert, remote_fingerprint: fingerprint}
end

defp notify(dst, msg), do: send(dst, {:dtls_transport, self(), msg})
end
3 changes: 3 additions & 0 deletions lib/ex_webrtc/ice_transport.ex
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ defmodule ExWebRTC.ICETransport do
@callback restart(pid()) :: :ok
@callback send_data(pid(), binary()) :: :ok
@callback set_remote_credentials(pid(), ufrag :: binary(), pwd :: binary()) :: :ok
@callback get_stats(pid()) :: map()
@callback stop(pid()) :: :ok
end

Expand Down Expand Up @@ -43,5 +44,7 @@ defmodule ExWebRTC.DefaultICETransport do
@impl true
defdelegate set_remote_credentials(pid, ufrag, pwd), to: ICEAgent
@impl true
defdelegate get_stats(pid), to: ICEAgent
@impl true
defdelegate stop(pid), to: ICEAgent
end
Loading

0 comments on commit 57d04fc

Please sign in to comment.