diff --git a/lib/ex_webrtc_dashboard.ex b/lib/ex_webrtc_dashboard.ex
index c681c10..d2c7433 100644
--- a/lib/ex_webrtc_dashboard.ex
+++ b/lib/ex_webrtc_dashboard.ex
@@ -13,7 +13,7 @@ defmodule ExWebRTCDashboard do
@impl true
def menu_link(_session, _caps) do
- {:ok, "Elixir WebRTC"}
+ {:ok, "WebRTC"}
end
@impl true
@@ -69,7 +69,7 @@ defmodule ExWebRTCDashboard do
def render(assigns) do
~H"""
<%= if @pc_pids == %{} do %>
- Waiting for peer connections to be spawned...
+ Waiting for PeerConnections to be spawned...
<% else %>
<.live_nav_bar id="navbar" page={@page}>
<:item :for={{pc_str, {_pc, pc_stats}} <- @pc_pids} name={pc_str} method="redirect">
@@ -95,23 +95,24 @@ defmodule ExWebRTCDashboard do
Process.send_after(self(), :update_stats, 1_000)
socket = update_pc_pids(socket)
pc_pids = socket.assigns.pc_pids
+ pc_str = socket.assigns.current_pc_str
cond do
- socket.assigns.current_pc_str == nil and pc_pids != %{} ->
+ pc_pids != %{} and (pc_str == nil or not Map.has_key?(pc_pids, pc_str)) ->
nav = List.first(Map.keys(socket.assigns.pc_pids))
to = live_dashboard_path(socket, socket.assigns.page, nav: nav)
{:noreply, push_navigate(socket, to: to)}
- socket.assigns.current_pc_str == nil ->
+ pc_str == nil ->
{:noreply, socket}
true ->
pc = socket.assigns.current_pc
- pc_str = socket.assigns.current_pc_str
case fetch_stats(pc) do
{:ok, stats} ->
- update_plots(stats)
+ {^pc, old_stats} = Map.fetch!(pc_pids, pc_str)
+ update_plots(stats, old_stats)
pc_pids = put_in(socket.assigns.pc_pids, [pc_str], {pc, stats})
socket = assign(socket, pc_pids: pc_pids)
{:noreply, socket}
@@ -153,7 +154,7 @@ defmodule ExWebRTCDashboard do
<.row>
<:col>
- <.card inner_title="Peer Connection state">
+ <.card inner_title="PeerConnection state">
<%= @peer_connection.connection_state %>
@@ -194,13 +195,13 @@ defmodule ExWebRTCDashboard do
<%= @title %>
<.row_table title="Cretificate" object={@cert}>
- <:row :let={cert} label="fingerprint">
+ <:row :let={cert} label="Fingerprint">
<%= cert.fingerprint %>
- <:row :let={cert} label="fingerprint">
+ <:row :let={cert} label="Algorithm">
<%= cert.fingerprint_algorithm %>
- <:row :let={cert} label="base64 certificate">
+ <:row :let={cert} label="Base64 certificate">
<%= cert.base64_certificate %>
@@ -213,12 +214,12 @@ defmodule ExWebRTCDashboard do
<%= @title %>
<.row_table title="Session Description" object={@desc}>
- <:row :let={desc} label="type">
+ <:row :let={desc} label="Type">
<%= if desc do %>
<%= desc.type %>
<% end %>
- <:row :let={desc} label="sdp">
+ <:row :let={desc} label="SDP">
<%= if desc do %>
<%= desc.sdp %>
<% end %>
@@ -228,61 +229,6 @@ defmodule ExWebRTCDashboard do
"""
end
- defp transport(assigns) do
- ~H"""
-
-
Transport
- <.row_table title="Transport" object={@transport}>
- <:row :let={transport} label="bytes sent">
- <%= transport.bytes_sent %>
-
- <:row :let={transport} label="bytes received">
- <%= transport.bytes_received %>
-
- <:row :let={transport} label="packets sent">
- <%= transport.packets_sent %>
-
- <:row :let={transport} label="packets received">
- <%= transport.packets_received %>
-
- <:row :let={transport} label="ice role">
- <%= transport.ice_role %>
-
- <:row :let={transport} label="ice local ufrag">
- <%= transport.ice_local_ufrag %>
-
-
-
-
- <.live_chart
- id="transport-bytes_sent"
- title="bytes_sent"
- kind={:last_value}
- prune_threshold={60}
- />
- <.live_chart
- id="transport-bytes_received"
- title="bytes_received"
- kind={:last_value}
- prune_threshold={60}
- />
- <.live_chart
- id="transport-packets_sent"
- title="packets_sent"
- kind={:last_value}
- prune_threshold={60}
- />
- <.live_chart
- id="transport-packets_received"
- title="packets_received"
- kind={:last_value}
- prune_threshold={60}
- />
-
-
- """
- end
-
defp candidates(assigns) do
~H"""
@@ -293,18 +239,18 @@ defmodule ExWebRTCDashboard do
- | address |
- port |
- protocol |
- candidate type |
- priority |
- foundation |
- related_address |
- related_port |
+ Address |
+ Port |
+ Protocol |
+ Candidate type |
+ Priority |
+ Foundation |
+ Related address |
+ Related port |
- <%= for cand <- @candidates do %>
+ <%= for cand <- Enum.sort(@candidates) do %>
| <%= :inet.ntoa(cand.address) %> |
<%= cand.port %> |
@@ -329,58 +275,88 @@ defmodule ExWebRTCDashboard do
"""
end
+ defp transport(assigns) do
+ ~H"""
+
+
Transport
+ <.row_table title="Transport" object={@transport}>
+ <:row :let={transport} label="Bytes sent">
+ <%= transport.bytes_sent %>
+
+ <:row :let={transport} label="Bytes received">
+ <%= transport.bytes_received %>
+
+ <:row :let={transport} label="Packets sent">
+ <%= transport.packets_sent %>
+
+ <:row :let={transport} label="Packets received">
+ <%= transport.packets_received %>
+
+ <:row :let={transport} label="ICE role">
+ <%= transport.ice_role %>
+
+ <:row :let={transport} label="ICE local ufrag">
+ <%= transport.ice_local_ufrag %>
+
+
+
+
+ <%= for {id, name} <- transport_stats() do %>
+ <.live_chart id={"transport-#{id}"} title={name} kind={:last_value} prune_threshold={60} />
+ <% end %>
+
+
+ """
+ end
+
defp inbound_rtp(assigns) do
~H"""
Inbound RTP <%= @inbound_rtp.id %>
<.row_table title={"Inbound RTP #{@inbound_rtp.id}"} object={@inbound_rtp}>
- <:row :let={inbound_rtp} label="kind">
+ <:row :let={inbound_rtp} label="Kind">
<%= inbound_rtp.kind %>
- <:row :let={inbound_rtp} label="rid">
+ <:row :let={inbound_rtp} label="RID">
<%= if inbound_rtp.rid != nil do %>
- <%= inbound_rtp.rid %>
+ <%= inspect(inbound_rtp.rid) %>
<% else %>
-
<% end %>
- <:row :let={inbound_rtp} label="mid">
- <%= inbound_rtp.mid %>
+ <:row :let={inbound_rtp} label="MID">
+ <%= inspect(inbound_rtp.mid) %>
- <:row :let={inbound_rtp} label="ssrc">
+ <:row :let={inbound_rtp} label="SSRC">
<%= inbound_rtp.ssrc %>
- <:row :let={inbound_rtp} label="bytes received">
+ <:row :let={inbound_rtp} label="Bytes received">
<%= inbound_rtp.bytes_received %>
- <:row :let={inbound_rtp} label="packets received">
+ <:row :let={inbound_rtp} label="Packets received">
<%= inbound_rtp.packets_received %>
- <:row :let={inbound_rtp} label="markers received">
+ <:row :let={inbound_rtp} label="Markers received">
<%= inbound_rtp.markers_received %>
+ <:row :let={inbound_rtp} label="NACKs sent">
+ <%= inbound_rtp.nack_count %>
+
+ <:row :let={inbound_rtp} label="PLIs sent">
+ <%= inbound_rtp.pli_count %>
+
- <.live_chart
- id={"inbound_rtp-bytes_received-#{@inbound_rtp.id}"}
- title="bytes_received"
- kind={:last_value}
- prune_threshold={60}
- />
- <.live_chart
- id={"inbound_rtp-packets_received-#{@inbound_rtp.id}"}
- title="packets_received"
- kind={:last_value}
- prune_threshold={60}
- />
- <.live_chart
- id={"inbound_rtp-markers_received-#{@inbound_rtp.id}"}
- title="markers_received"
- kind={:last_value}
- prune_threshold={60}
- />
+ <%= for {id, name} <- inbound_rtp_stats() do %>
+ <.live_chart
+ id={"inbound_rtp-#{id}-#{@inbound_rtp.id}"}
+ title={name}
+ kind={:last_value}
+ prune_threshold={60}
+ />
+ <% end %>
"""
@@ -392,48 +368,47 @@ defmodule ExWebRTCDashboard do
Outbound RTP <%= @outbound_rtp.id %>
<.row_table title={"Outbound RTP #{@outbound_rtp.id}"} object={@outbound_rtp}>
- <:row :let={outbound_rtp} label="kind">
+ <:row :let={outbound_rtp} label="Kind">
<%= outbound_rtp.kind %>
- <:row :let={outbound_rtp} label="mid">
- <%= outbound_rtp.mid %>
+ <:row :let={outbound_rtp} label="MID">
+ <%= inspect(outbound_rtp.mid) %>
- <:row :let={outbound_rtp} label="ssrc">
+ <:row :let={outbound_rtp} label="SSRC">
<%= outbound_rtp.ssrc %>
- <:row :let={outbound_rtp} label="kind">
- <%= outbound_rtp.kind %>
-
- <:row :let={outbound_rtp} label="bytes sent">
+ <:row :let={outbound_rtp} label="Bytes sent">
<%= outbound_rtp.bytes_sent %>
- <:row :let={outbound_rtp} label="packets sent">
+ <:row :let={outbound_rtp} label="Packets sent">
<%= outbound_rtp.packets_sent %>
- <:row :let={outbound_rtp} label="markers sent">
+ <:row :let={outbound_rtp} label="Retransmitted bytes sent">
+ <%= outbound_rtp.retransmitted_bytes_sent %>
+
+ <:row :let={outbound_rtp} label="Retransmitted packets sent">
+ <%= outbound_rtp.retransmitted_packets_sent %>
+
+ <:row :let={outbound_rtp} label="Markers sent">
<%= outbound_rtp.markers_sent %>
+ <:row :let={outbound_rtp} label="NACKs received">
+ <%= outbound_rtp.nack_count %>
+
+ <:row :let={outbound_rtp} label="PLIs received">
+ <%= outbound_rtp.pli_count %>
+
- <.live_chart
- id={"outbound_rtp-bytes_sent-#{@outbound_rtp.id}"}
- title="bytes_sent"
- kind={:last_value}
- prune_threshold={60}
- />
- <.live_chart
- id={"outbound_rtp-packets_sent-#{@outbound_rtp.id}"}
- title="packets_sent"
- kind={:last_value}
- prune_threshold={60}
- />
- <.live_chart
- id={"outbound_rtp-markers_sent-#{@outbound_rtp.id}"}
- title="markers_sent"
- kind={:last_value}
- prune_threshold={60}
- />
+ <%= for {id, name} <- outbound_rtp_stats() do %>
+ <.live_chart
+ id={"outbound_rtp-#{id}-#{@outbound_rtp.id}"}
+ title={name}
+ kind={:last_value}
+ prune_threshold={60}
+ />
+ <% end %>
"""
@@ -469,58 +444,81 @@ defmodule ExWebRTCDashboard do
end
end
- defp update_plots(stats) do
- send_data_to_chart("transport-bytes_sent", [
- {nil, stats.transport.bytes_sent, System.system_time(:microsecond)}
- ])
-
- send_data_to_chart("transport-bytes_received", [
- {nil, stats.transport.bytes_received, System.system_time(:microsecond)}
- ])
-
- send_data_to_chart("transport-packets_sent", [
- {nil, stats.transport.packets_sent, System.system_time(:microsecond)}
- ])
-
- send_data_to_chart("transport-packets_received", [
- {nil, stats.transport.packets_received, System.system_time(:microsecond)}
- ])
+ defp update_plots(stats, old_stats) do
+ timestamp = System.system_time(:microsecond)
+
+ [
+ {"bytes_sent", stats.transport.bytes_sent},
+ {"bytes_sent_bits_sec",
+ per_sec_stat(stats.transport, old_stats.transport, :bytes_sent) * 8},
+ {"bytes_received", stats.transport.bytes_received},
+ {"bytes_received_bits_sec",
+ per_sec_stat(stats.transport, old_stats.transport, :bytes_received) * 8},
+ {"packets_sent", stats.transport.packets_sent},
+ {"packets_sent_sec", per_sec_stat(stats.transport, old_stats.transport, :packets_sent)},
+ {"packets_received", stats.transport.packets_received},
+ {"packets_received_sec",
+ per_sec_stat(stats.transport, old_stats.transport, :packets_received)}
+ ]
+ |> Enum.each(fn {id, data} ->
+ send_data_to_chart("transport-#{id}", [{nil, data, timestamp}])
+ end)
for inbound_rtp <- stats.inbound_rtp do
+ old_inbound_rtp = Enum.find(old_stats.inbound_rtp, &(&1.id == inbound_rtp.id))
timestamp = to_micro(inbound_rtp.timestamp)
- send_data_to_chart("inbound_rtp-bytes_received-#{inbound_rtp.id}", [
- {nil, inbound_rtp.bytes_received, timestamp}
- ])
-
- send_data_to_chart("inbound_rtp-packets_received-#{inbound_rtp.id}", [
- {nil, inbound_rtp.packets_received, timestamp}
- ])
-
- send_data_to_chart("inbound_rtp-markers_received-#{inbound_rtp.id}", [
- {nil, inbound_rtp.markers_received, timestamp}
- ])
+ [
+ {"bytes_received", inbound_rtp.bytes_received},
+ {"bytes_received_bits_sec",
+ per_sec_stat(inbound_rtp, old_inbound_rtp, :bytes_received) * 8},
+ {"packets_received", inbound_rtp.packets_received},
+ {"packets_received_sec", per_sec_stat(inbound_rtp, old_inbound_rtp, :packets_received)},
+ {"markers_received", inbound_rtp.markers_received},
+ {"markers_received_sec", per_sec_stat(inbound_rtp, old_inbound_rtp, :markers_received)},
+ {"nack_count", inbound_rtp.nack_count},
+ {"pli_count", inbound_rtp.pli_count}
+ ]
+ |> Enum.each(fn {id, data} ->
+ send_data_to_chart("inbound_rtp-#{id}-#{inbound_rtp.id}", [{nil, data, timestamp}])
+ end)
end
for outbound_rtp <- stats.outbound_rtp do
+ old_outbound_rtp = Enum.find(old_stats.outbound_rtp, &(&1.id == outbound_rtp.id))
timestamp = to_micro(outbound_rtp.timestamp)
- send_data_to_chart("outbound_rtp-bytes_sent-#{outbound_rtp.id}", [
- {nil, outbound_rtp.bytes_sent, timestamp}
- ])
-
- send_data_to_chart("outbound_rtp-packets_sent-#{outbound_rtp.id}", [
- {nil, outbound_rtp.packets_sent, timestamp}
- ])
-
- send_data_to_chart("outbound_rtp-markers_sent-#{outbound_rtp.id}", [
- {nil, outbound_rtp.markers_sent, timestamp}
- ])
+ [
+ {"bytes_sent", outbound_rtp.bytes_sent},
+ {"bytes_sent_bits_sec", per_sec_stat(outbound_rtp, old_outbound_rtp, :bytes_sent) * 8},
+ {"packets_sent", outbound_rtp.packets_sent},
+ {"packets_sent_sec", per_sec_stat(outbound_rtp, old_outbound_rtp, :packets_sent)},
+ {"retransmitted_bytes_sent", outbound_rtp.retransmitted_bytes_sent},
+ {"retransmitted_bytes_sent_bits_sec",
+ per_sec_stat(outbound_rtp, old_outbound_rtp, :retransmitted_bytes_sent) * 8},
+ {"retransmitted_packets_sent", outbound_rtp.retransmitted_packets_sent},
+ {"retransmitted_packets_sent_sec",
+ per_sec_stat(outbound_rtp, old_outbound_rtp, :retransmitted_packets_sent)},
+ {"markers_sent", outbound_rtp.markers_sent},
+ {"markers_sent_sec", per_sec_stat(outbound_rtp, old_outbound_rtp, :markers_sent)},
+ {"nack_count", outbound_rtp.nack_count},
+ {"pli_count", outbound_rtp.pli_count}
+ ]
+ |> Enum.each(fn {id, data} ->
+ send_data_to_chart("outbound_rtp-#{id}-#{outbound_rtp.id}", [{nil, data, timestamp}])
+ end)
end
end
defp to_micro(milliseconds), do: milliseconds * 1_000
+ defp per_sec_stat(_new_stats, nil, _key), do: 0
+
+ defp per_sec_stat(new_stats, old_stats, key) do
+ ts_diff = (new_stats[:timestamp] - old_stats[:timestamp]) / 1000
+ (new_stats[key] - old_stats[key]) / ts_diff
+ end
+
# Converts a map into two-column table.
#
# ach row consists of two columns where the first column is a map key
@@ -562,4 +560,47 @@ defmodule ExWebRTCDashboard do
"""
end
+
+ defp transport_stats do
+ [
+ {"bytes_sent", "Bytes sent"},
+ {"bytes_sent_bits_sec", "Bytes sent in bits/s"},
+ {"bytes_received", "Bytes received"},
+ {"bytes_received_bits_sec", "Bytes received in bits/s"},
+ {"packets_sent", "Packets sent"},
+ {"packets_sent_sec", "Packets sent/s"},
+ {"packets_received", "Packets received"},
+ {"packets_received_sec", "Packets received/s"}
+ ]
+ end
+
+ defp inbound_rtp_stats do
+ [
+ {"bytes_received", "Bytes received"},
+ {"bytes_received_bits_sec", "Bytes received in bits/s"},
+ {"packets_received", "Packets received/s"},
+ {"packets_received_sec", "Packets received/s"},
+ {"markers_received", "Markers received"},
+ {"markers_received_sec", "Markers received/s"},
+ {"nack_count", "NACKs sent"},
+ {"pli_count", "PLIs sent"}
+ ]
+ end
+
+ defp outbound_rtp_stats do
+ [
+ {"bytes_sent", "Bytes sent"},
+ {"bytes_sent_bits_sec", "Bytes sent in bits/s"},
+ {"packets_sent", "Packets sent"},
+ {"packets_sent_sec", "Packets sent/s"},
+ {"retransmitted_bytes_sent", "Retransmitted bytes sent"},
+ {"retransmitted_bytes_sent_bits_sec", "Retransmitted bytes sent in bits/s"},
+ {"retransmitted_packets_sent", "Retransmitted packets sent"},
+ {"retransmitted_packets_sent_sec", "Retransmitted packets sent/s"},
+ {"markers_sent", "Markers sent"},
+ {"markers_sent_sec", "Markers sent/s"},
+ {"nack_count", "NACKs received"},
+ {"pli_count", "PLIs received"}
+ ]
+ end
end
diff --git a/mix.exs b/mix.exs
index 55a32f3..5d1fdb0 100644
--- a/mix.exs
+++ b/mix.exs
@@ -42,7 +42,7 @@ defmodule ExWebRTCDashboard.MixProject do
defp deps do
[
{:phoenix_live_dashboard, "~> 0.8.3"},
- {:ex_webrtc, "~> 0.3.0"},
+ {:ex_webrtc, github: "elixir-webrtc/ex_webrtc"},
{:ex_doc, "~> 0.31.0", only: :dev, runtime: false}
]
end
diff --git a/mix.lock b/mix.lock
index da2b587..1ec6d79 100644
--- a/mix.lock
+++ b/mix.lock
@@ -1,14 +1,14 @@
%{
"bunch": {:hex, :bunch, "1.6.1", "5393d827a64d5f846092703441ea50e65bc09f37fd8e320878f13e63d410aec7", [:mix], [], "hexpm", "286cc3add551628b30605efbe2fca4e38cc1bea89bcd0a1a7226920b3364fe4a"},
"bunch_native": {:hex, :bunch_native, "0.5.0", "8ac1536789a597599c10b652e0b526d8833348c19e4739a0759a2bedfd924e63", [:mix], [{:bundlex, "~> 1.0", [hex: :bundlex, repo: "hexpm", optional: false]}], "hexpm", "24190c760e32b23b36edeb2dc4852515c7c5b3b8675b1a864e0715bdd1c8f80d"},
- "bundlex": {:hex, :bundlex, "1.5.1", "a85890a9d0a70366afa538c8589a4ba75e1319d32a771e1f5f3b7566beea9c26", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:elixir_uuid, "~> 1.2", [hex: :elixir_uuid, repo: "hexpm", optional: false]}, {:qex, "~> 0.5", [hex: :qex, repo: "hexpm", optional: false]}, {:req, "~> 0.4.0", [hex: :req, repo: "hexpm", optional: false]}, {:zarex, "~> 1.0", [hex: :zarex, repo: "hexpm", optional: false]}], "hexpm", "aae447d63230fe1f3b788c429ac02bc696f30163d0f23f52fcfe6ed38372c7ea"},
- "castore": {:hex, :castore, "1.0.7", "b651241514e5f6956028147fe6637f7ac13802537e895a724f90bf3e36ddd1dd", [:mix], [], "hexpm", "da7785a4b0d2a021cd1292a60875a784b6caef71e76bf4917bdee1f390455cf5"},
+ "bundlex": {:hex, :bundlex, "1.5.2", "056ea30a2efb1005940d965e92b9d012c6f6f8f718c7c8272d317ad5db62b966", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:elixir_uuid, "~> 1.2", [hex: :elixir_uuid, repo: "hexpm", optional: false]}, {:qex, "~> 0.5", [hex: :qex, repo: "hexpm", optional: false]}, {:req, ">= 0.4.0", [hex: :req, repo: "hexpm", optional: false]}, {:zarex, "~> 1.0", [hex: :zarex, repo: "hexpm", optional: false]}], "hexpm", "b8e3dcb61f29957e7dc2c6b9f7de255e258df95f90bd3c32838ede9718d2db0a"},
+ "castore": {:hex, :castore, "1.0.8", "dedcf20ea746694647f883590b82d9e96014057aff1d44d03ec90f36a5c0dc6e", [:mix], [], "hexpm", "0b2b66d2ee742cb1d9cb8c8be3b43c3a70ee8651f37b75a8b982e036752983f1"},
"crc": {:hex, :crc, "0.10.5", "ee12a7c056ac498ef2ea985ecdc9fa53c1bfb4e53a484d9f17ff94803707dfd8", [:mix, :rebar3], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "3e673b6495a9525c5c641585af1accba59a1eb33de697bedf341e247012c2c7f"},
"earmark_parser": {:hex, :earmark_parser, "1.4.39", "424642f8335b05bb9eb611aa1564c148a8ee35c9c8a8bba6e129d51a3e3c6769", [:mix], [], "hexpm", "06553a88d1f1846da9ef066b87b57c6f605552cfbe40d20bd8d59cc6bde41944"},
"elixir_make": {:hex, :elixir_make, "0.8.4", "4960a03ce79081dee8fe119d80ad372c4e7badb84c493cc75983f9d3bc8bde0f", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.0", [hex: :certifi, repo: "hexpm", optional: true]}], "hexpm", "6e7f1d619b5f61dfabd0a20aa268e575572b542ac31723293a4c1a567d5ef040"},
"elixir_uuid": {:hex, :elixir_uuid, "1.2.1", "dce506597acb7e6b0daeaff52ff6a9043f5919a4c3315abb4143f0b00378c097", [:mix], [], "hexpm", "f7eba2ea6c3555cea09706492716b0d87397b88946e6380898c2889d68585752"},
"ex_doc": {:hex, :ex_doc, "0.31.2", "8b06d0a5ac69e1a54df35519c951f1f44a7b7ca9a5bb7a260cd8a174d6322ece", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.1", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "317346c14febaba9ca40fd97b5b5919f7751fb85d399cc8e7e8872049f37e0af"},
- "ex_dtls": {:hex, :ex_dtls, "0.15.1", "34b3600ff13eebf6c96be033005cc110ea5beef98394631365ec26b493df80c5", [:mix], [{:unifex, "~> 1.0", [hex: :unifex, repo: "hexpm", optional: false]}], "hexpm", "9cfebdfe9111c0f68c77667cb9366e4a6f17e8a240975ffd100148de57478a29"},
+ "ex_dtls": {:hex, :ex_dtls, "0.15.2", "6c8c0f8eb67525216551bd3e0322ab33c9d851d56ef3e065efab4fd277a8fbb9", [:mix], [{:unifex, "~> 1.0", [hex: :unifex, repo: "hexpm", optional: false]}], "hexpm", "6b852bc926bbdc9c1b9c4ecc6cfc73a89d4e106042802cefea2c1503072a9f2a"},
"ex_ice": {:hex, :ex_ice, "0.7.1", "3ad14f7281ece304dfee227e332b8a67d93d5857602a8a4300a826c250af136e", [:mix], [{:elixir_uuid, "~> 1.0", [hex: :elixir_uuid, repo: "hexpm", optional: false]}, {:ex_stun, "~> 0.2.0", [hex: :ex_stun, repo: "hexpm", optional: false]}, {:ex_turn, "~> 0.1.0", [hex: :ex_turn, repo: "hexpm", optional: false]}], "hexpm", "78e6bc4abb5294dcf0a474d0a91e78a829916291d846a0e255867dc5db8733e7"},
"ex_libsrtp": {:hex, :ex_libsrtp, "0.7.2", "211bd89c08026943ce71f3e2c0231795b99cee748808ed3ae7b97cd8d2450b6b", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:bundlex, "~> 1.3", [hex: :bundlex, repo: "hexpm", optional: false]}, {:membrane_precompiled_dependency_provider, "~> 0.1.0", [hex: :membrane_precompiled_dependency_provider, repo: "hexpm", optional: false]}, {:unifex, "~> 1.1", [hex: :unifex, repo: "hexpm", optional: false]}], "hexpm", "2e20645d0d739a4ecdcf8d4810a0c198120c8a2f617f2b75b2e2e704d59f492a"},
"ex_rtcp": {:hex, :ex_rtcp, "0.4.0", "f9e515462a9581798ff6413583a25174cfd2101c94a2ebee871cca7639886f0a", [:mix], [], "hexpm", "28956602cf210d692fcdaf3f60ca49681634e1deb28ace41246aee61ee22dc3b"},
@@ -16,16 +16,16 @@
"ex_sdp": {:hex, :ex_sdp, "0.17.0", "4c50e7814f01f149c0ccf258fba8428f8567dffecf1c416ec3f6aaaac607a161", [:mix], [{:bunch, "~> 1.3", [hex: :bunch, repo: "hexpm", optional: false]}, {:elixir_uuid, "~> 1.2", [hex: :elixir_uuid, repo: "hexpm", optional: false]}], "hexpm", "c7fe0625902be2a835b5fe6834a189f7db7639d2625c8e9d8b3564e6d704145f"},
"ex_stun": {:hex, :ex_stun, "0.2.0", "feb1fc7db0356406655b2a617805e6c712b93308c8ea2bf0ba1197b1f0866deb", [:mix], [], "hexpm", "1e01ba8290082ccbf37acaa5190d1f69b51edd6de2026a8d6d51368b29d115d0"},
"ex_turn": {:hex, :ex_turn, "0.1.0", "177405aadf3d754567d0d37cf881a83f9cacf8f45314d188633b04c4a9e7c1ec", [:mix], [{:ex_stun, "~> 0.2.0", [hex: :ex_stun, repo: "hexpm", optional: false]}], "hexpm", "d677737fb7d45274d5dac19fe3c26b9038b6effbc0a6b3e7417bccc76b6d1cd3"},
- "ex_webrtc": {:hex, :ex_webrtc, "0.3.0", "283f5b31d539f65238596793aabcefe32d221618ceb751ae68951712a486cac2", [:mix], [{:crc, "~> 0.10", [hex: :crc, repo: "hexpm", optional: false]}, {:ex_dtls, "~> 0.15.0", [hex: :ex_dtls, repo: "hexpm", optional: false]}, {:ex_ice, "~> 0.7.0", [hex: :ex_ice, repo: "hexpm", optional: false]}, {:ex_libsrtp, "~> 0.7.1", [hex: :ex_libsrtp, repo: "hexpm", optional: false]}, {:ex_rtcp, "~> 0.4.0", [hex: :ex_rtcp, repo: "hexpm", optional: false]}, {:ex_rtp, "~> 0.4.0", [hex: :ex_rtp, repo: "hexpm", optional: false]}, {:ex_sdp, "~> 0.17.0", [hex: :ex_sdp, repo: "hexpm", optional: false]}], "hexpm", "a8a4f38cdcacae170615d6abb83d8c42220b6ac0133d84b900f4994d5eff7143"},
+ "ex_webrtc": {:git, "https://github.com/elixir-webrtc/ex_webrtc.git", "3afedc65ed457e9f362b274dc19f53916d0bd38a", []},
"finch": {:hex, :finch, "0.18.0", "944ac7d34d0bd2ac8998f79f7a811b21d87d911e77a786bc5810adb75632ada4", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2.6 or ~> 1.0", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "69f5045b042e531e53edc2574f15e25e735b522c37e2ddb766e15b979e03aa65"},
- "hpax": {:hex, :hpax, "0.2.0", "5a58219adcb75977b2edce5eb22051de9362f08236220c9e859a47111c194ff5", [:mix], [], "hexpm", "bea06558cdae85bed075e6c036993d43cd54d447f76d8190a8db0dc5893fa2f1"},
- "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"},
+ "hpax": {:hex, :hpax, "1.0.0", "28dcf54509fe2152a3d040e4e3df5b265dcb6cb532029ecbacf4ce52caea3fd2", [:mix], [], "hexpm", "7f1314731d711e2ca5fdc7fd361296593fc2542570b3105595bb0bc6d0fad601"},
+ "jason": {:hex, :jason, "1.4.3", "d3f984eeb96fe53b85d20e0b049f03e57d075b5acda3ac8d465c969a2536c17b", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "9a90e868927f7c777689baa16d86f4d0e086d968db5c05d917ccff6d443e58a3"},
"makeup": {:hex, :makeup, "1.1.2", "9ba8837913bdf757787e71c1581c21f9d2455f4dd04cfca785c70bbfff1a76a3", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cce1566b81fbcbd21eca8ffe808f33b221f9eee2cbc7a1706fc3da9ff18e6cac"},
"makeup_elixir": {:hex, :makeup_elixir, "0.16.2", "627e84b8e8bf22e60a2579dad15067c755531fea049ae26ef1020cad58fe9578", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "41193978704763f6bbe6cc2758b84909e62984c7752b3784bd3c218bb341706b"},
"makeup_erlang": {:hex, :makeup_erlang, "0.1.5", "e0ff5a7c708dda34311f7522a8758e23bfcd7d8d8068dc312b5eb41c6fd76eba", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "94d2e986428585a21516d7d7149781480013c56e30c6a233534bedf38867a59a"},
"membrane_precompiled_dependency_provider": {:hex, :membrane_precompiled_dependency_provider, "0.1.2", "8af73b7dc15ba55c9f5fbfc0453d4a8edfb007ade54b56c37d626be0d1189aba", [:mix], [{:bundlex, "~> 1.4", [hex: :bundlex, repo: "hexpm", optional: false]}], "hexpm", "7fe3e07361510445a29bee95336adde667c4162b76b7f4c8af3aeb3415292023"},
- "mime": {:hex, :mime, "2.0.5", "dc34c8efd439abe6ae0343edbb8556f4d63f178594894720607772a041b04b02", [:mix], [], "hexpm", "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"},
- "mint": {:hex, :mint, "1.6.1", "065e8a5bc9bbd46a41099dfea3e0656436c5cbcb6e741c80bd2bad5cd872446f", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "4fc518dcc191d02f433393a72a7ba3f6f94b101d094cb6bf532ea54c89423780"},
+ "mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"},
+ "mint": {:hex, :mint, "1.6.2", "af6d97a4051eee4f05b5500671d47c3a67dac7386045d87a904126fd4bbcea2e", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "5ee441dffc1892f1ae59127f74afe8fd82fda6587794278d924e4d90ea3d63f9"},
"nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"},
"nimble_ownership": {:hex, :nimble_ownership, "0.3.1", "99d5244672fafdfac89bfad3d3ab8f0d367603ce1dc4855f86a1c75008bce56f", [:mix], [], "hexpm", "4bf510adedff0449a1d6e200e43e57a814794c8b5b6439071274d248d272a549"},
"nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"},
@@ -39,7 +39,7 @@
"plug": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"},
"plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"},
"qex": {:hex, :qex, "0.5.1", "0d82c0f008551d24fffb99d97f8299afcb8ea9cf99582b770bd004ed5af63fd6", [:mix], [], "hexpm", "935a39fdaf2445834b95951456559e9dc2063d0a055742c558a99987b38d6bab"},
- "req": {:hex, :req, "0.4.14", "103de133a076a31044e5458e0f850d5681eef23dfabf3ea34af63212e3b902e2", [:mix], [{:aws_signature, "~> 0.3.2", [hex: :aws_signature, repo: "hexpm", optional: true]}, {:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.17", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:nimble_ownership, "~> 0.2.0 or ~> 0.3.0", [hex: :nimble_ownership, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "2ddd3d33f9ab714ced8d3c15fd03db40c14dbf129003c4a3eb80fac2cc0b1b08"},
+ "req": {:hex, :req, "0.5.2", "70b4976e5fbefe84e5a57fd3eea49d4e9aa0ac015301275490eafeaec380f97f", [:mix], [{:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.17", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 2.0.6 or ~> 2.1", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "0c63539ab4c2d6ced6114d2684276cef18ac185ee00674ee9af4b1febba1f986"},
"shmex": {:hex, :shmex, "0.5.1", "81dd209093416bf6608e66882cb7e676089307448a1afd4fc906c1f7e5b94cf4", [:mix], [{:bunch_native, "~> 0.5.0", [hex: :bunch_native, repo: "hexpm", optional: false]}, {:bundlex, "~> 1.0", [hex: :bundlex, repo: "hexpm", optional: false]}], "hexpm", "c29f8286891252f64c4e1dac40b217d960f7d58def597c4e606ff8fbe71ceb80"},
"telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"},
"telemetry_metrics": {:hex, :telemetry_metrics, "1.0.0", "29f5f84991ca98b8eb02fc208b2e6de7c95f8bb2294ef244a176675adc7775df", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f23713b3847286a534e005126d4c959ebcca68ae9582118ce436b521d1d47d5d"},