Current section

Files

Jump to
Raw

lib/nif.ex

defmodule Mediasoup.Nif do
@moduledoc false
# Nif interface for mediasoup
# Do not use directly
version = Mix.Project.config()[:version]
defmodule Build do
@moduledoc false
def prebuild_targets() do
# Anything that is difficult to prebuilt in cross compile is excluded for now.
[
"aarch64-apple-darwin",
"aarch64-unknown-linux-gnu",
"aarch64-unknown-linux-musl",
"arm-unknown-linux-gnueabihf",
"riscv64gc-unknown-linux-gnu",
"x86_64-apple-darwin",
# "x86_64-pc-windows-gnu",
# "x86_64-pc-windows-msvc",
"x86_64-unknown-linux-gnu",
"x86_64-unknown-linux-musl"
]
end
defp prebuild_target?() do
case RustlerPrecompiled.target() do
{:ok, target} -> prebuild_targets() |> Enum.any?(&String.contains?(target, &1))
_ -> false
end
end
def force_build?(),
do:
System.get_env("RUSTLER_PRECOMPILATION_MEDIASOUP_BUILD") in ["1", "true"] or
not prebuild_target?()
end
use RustlerPrecompiled,
otp_app: :mediasoup_elixir,
crate: "mediasoup_elixir",
base_url: "https://github.com/oviceinc/mediasoup-elixir/releases/download/v#{version}",
force_build: Build.force_build?(),
targets: Build.prebuild_targets(),
version: version
# use Rustler, otp_app: :mediasoup_elixir, crate: :mediasoup_elixir
alias Mediasoup.{Worker, Router}
# async nif functions
## worker with async
defp create_worker_async(), do: :erlang.nif_error(:nif_not_loaded)
defp create_worker_async(_option), do: :erlang.nif_error(:nif_not_loaded)
# plain transport
## properties
def plain_transport_tuple(_transport), do: :erlang.nif_error(:nif_not_loaded)
def plain_transport_sctp_parameters(_transport), do: :erlang.nif_error(:nif_not_loaded)
def plain_transport_srtp_parameters(_transport), do: :erlang.nif_error(:nif_not_loaded)
def plain_transport_sctp_state(_transport), do: :erlang.nif_error(:nif_not_loaded)
## methods
### plain tranasport call
def plain_transport_connect_async(_transport, _option, _from),
do: :erlang.nif_error(:nif_not_loaded)
@spec plain_transport_id(reference) :: String.t()
def plain_transport_id(_transport), do: :erlang.nif_error(:nif_not_loaded)
def plain_transport_dump_async(_transport, _from), do: :erlang.nif_error(:nif_not_loaded)
def plain_transport_get_stats_async(_transport, _from), do: :erlang.nif_error(:nif_not_loaded)
def plain_transport_produce_async(_transport, _option, _from),
do: :erlang.nif_error(:nif_not_loaded)
def plain_transport_consume_async(_transport, _option, _from),
do: :erlang.nif_error(:nif_not_loaded)
@spec plain_transport_close(reference) :: {:ok} | {:error}
def plain_transport_close(_transport), do: :erlang.nif_error(:nif_not_loaded)
@spec plain_transport_closed(reference) :: boolean
def plain_transport_closed(_transport), do: :erlang.nif_error(:nif_not_loaded)
## plain transport event
@spec plain_transport_event(reference, pid, [atom()]) :: {:ok} | {:error}
def plain_transport_event(_transport, _pid, _event_types),
do: :erlang.nif_error(:nif_not_loaded)
# construct worker
def create_worker(), do: create_worker_async() |> handle_async_nif_result()
def create_worker(option), do: create_worker_async(option) |> handle_async_nif_result()
@spec worker_global_count :: non_neg_integer()
def worker_global_count(), do: :erlang.nif_error(:nif_not_loaded)
# worker
@spec worker_create_router_async(reference, Router.create_option(), term()) ::
:ok | :error
def worker_create_router_async(_worker, _option, _from),
do: :erlang.nif_error(:nif_not_loaded)
@spec worker_id(reference) :: String.t()
def worker_id(_worker), do: :erlang.nif_error(:nif_not_loaded)
@spec worker_close(reference) :: {:ok} | {:error}
def worker_close(_worker), do: :erlang.nif_error(:nif_not_loaded)
@spec worker_event(reference, pid, [atom()]) :: {:ok} | {:error}
def worker_event(_worker, _pid, _event_types), do: :erlang.nif_error(:nif_not_loaded)
@spec worker_closed(reference) :: boolean
def worker_closed(_worker), do: :erlang.nif_error(:nif_not_loaded)
@spec worker_update_settings_async(reference, Worker.update_option(), GenServer.from()) ::
{:ok} | {:error}
def worker_update_settings_async(_worker, _option, _from),
do: :erlang.nif_error(:nif_not_loaded)
def worker_create_webrtc_server_async(_worker, _option, _from),
do: :erlang.nif_error(:nif_not_loaded)
@spec worker_dump_async(reference, term()) :: map | {:error}
def worker_dump_async(_worker, _from),
do: :erlang.nif_error(:nif_not_loaded)
# router
@spec router_id(reference) :: String.t()
def router_id(_router), do: :erlang.nif_error(:nif_not_loaded)
@spec router_close(reference) :: {:ok} | {:error}
def router_close(_router), do: :erlang.nif_error(:nif_not_loaded)
def router_closed(_router), do: :erlang.nif_error(:nif_not_loaded)
def router_create_pipe_transport_async(
_reference,
_option,
_from
),
do: :erlang.nif_error(:nif_not_loaded)
def router_create_webrtc_transport_async(_router, _option, _from),
do: :erlang.nif_error(:nif_not_loaded)
def router_create_plain_transport_async(_router, _option, _from),
do: :erlang.nif_error(:nif_not_loaded)
@spec router_can_consume(reference, String.t(), Router.rtpCapabilities()) :: boolean
def router_can_consume(_router, _producer_id, _rtp_capabilities),
do: :erlang.nif_error(:nif_not_loaded)
@spec router_rtp_capabilities(reference) :: Router.rtpCapabilities()
def router_rtp_capabilities(_router), do: :erlang.nif_error(:nif_not_loaded)
@spec router_event(reference, pid, [atom()]) :: {:ok} | {:error}
def router_event(_router, _pid, _event_types), do: :erlang.nif_error(:nif_not_loaded)
def router_dump_async(_router, _from), do: :erlang.nif_error(:nif_not_loaded)
# webrtc_server
@spec webrtc_server_id(reference) :: String.t()
def webrtc_server_id(_server), do: :erlang.nif_error(:nif_not_loaded)
@spec webrtc_server_close(reference) :: {:ok} | {:error}
def webrtc_server_close(_server), do: :erlang.nif_error(:nif_not_loaded)
@spec webrtc_server_closed(reference) :: boolean
def webrtc_server_closed(_server), do: :erlang.nif_error(:nif_not_loaded)
def webrtc_server_dump_async(_server, _from), do: :erlang.nif_error(:nif_not_loaded)
# webrtc_transport
@spec webrtc_transport_id(reference) :: String.t()
def webrtc_transport_id(_transport), do: :erlang.nif_error(:nif_not_loaded)
@spec webrtc_transport_close(reference) :: {:ok} | {:error}
def webrtc_transport_close(_transport), do: :erlang.nif_error(:nif_not_loaded)
@spec webrtc_transport_closed(reference) :: boolean
def webrtc_transport_closed(_transport), do: :erlang.nif_error(:nif_not_loaded)
@spec webrtc_transport_consume_async(reference, any, term) ::
{:ok, reference()} | {:error, String.t()}
def webrtc_transport_consume_async(_transport, _option, _from),
do: :erlang.nif_error(:nif_not_loaded)
@spec webrtc_transport_consume_data_async(reference, any, term) ::
{:ok, reference()} | {:error, String.t()}
def webrtc_transport_consume_data_async(_transport, _option, _from),
do: :erlang.nif_error(:nif_not_loaded)
@spec webrtc_transport_connect_async(reference, any, term) :: {:ok} | {:error, String.t()}
def webrtc_transport_connect_async(_transport, _option, _from),
do: :erlang.nif_error(:nif_not_loaded)
@spec webrtc_transport_produce_async(reference, any, term) ::
{:ok, reference()} | {:error, String.t()}
def webrtc_transport_produce_async(_transport, _option, _from),
do: :erlang.nif_error(:nif_not_loaded)
@spec webrtc_transport_produce_data_async(reference, any, term) ::
{:ok, reference()} | {:error, String.t()}
def webrtc_transport_produce_data_async(_transport, _option, _from),
do: :erlang.nif_error(:nif_not_loaded)
def webrtc_transport_ice_parameters(_transport), do: :erlang.nif_error(:nif_not_loaded)
def webrtc_transport_ice_candidates(_transport), do: :erlang.nif_error(:nif_not_loaded)
def webrtc_transport_ice_role(_transport), do: :erlang.nif_error(:nif_not_loaded)
def webrtc_transport_sctp_parameters(_transport), do: :erlang.nif_error(:nif_not_loaded)
def webrtc_transport_set_max_incoming_bitrate_async(_transport, _bitrate, _from),
do: :erlang.nif_error(:nif_not_loaded)
def webrtc_transport_set_max_outgoing_bitrate_async(_transport, _bitrate, _from),
do: :erlang.nif_error(:nif_not_loaded)
def webrtc_transport_ice_state(_transport), do: :erlang.nif_error(:nif_not_loaded)
def webrtc_transport_restart_ice_async(_transport, _from),
do: :erlang.nif_error(:nif_not_loaded)
def webrtc_transport_ice_selected_tuple(_transport), do: :erlang.nif_error(:nif_not_loaded)
def webrtc_transport_dtls_parameters(_transport), do: :erlang.nif_error(:nif_not_loaded)
def webrtc_transport_dtls_state(_transport), do: :erlang.nif_error(:nif_not_loaded)
def webrtc_transport_sctp_state(_transport), do: :erlang.nif_error(:nif_not_loaded)
def webrtc_transport_get_stats_async(_transport, _from), do: :erlang.nif_error(:nif_not_loaded)
@spec webrtc_transport_event(reference, pid, [atom()]) :: {:ok} | {:error}
def webrtc_transport_event(_transport, _pid, _event_types),
do: :erlang.nif_error(:nif_not_loaded)
def webrtc_transport_dump_async(_transport, _from), do: :erlang.nif_error(:nif_not_loaded)
# pipe_transport
def pipe_transport_id(_transport), do: :erlang.nif_error(:nif_not_loaded)
def pipe_transport_close(_transport), do: :erlang.nif_error(:nif_not_loaded)
@spec pipe_transport_closed(reference) :: boolean
def pipe_transport_closed(_transport), do: :erlang.nif_error(:nif_not_loaded)
def pipe_transport_consume_async(_transport, _option, _from),
do: :erlang.nif_error(:nif_not_loaded)
def pipe_transport_consume_data_async(_transport, _option, _from),
do: :erlang.nif_error(:nif_not_loaded)
def pipe_transport_connect_async(_transport, _option, _from),
do: :erlang.nif_error(:nif_not_loaded)
def pipe_transport_produce_async(_transport, _option, _from),
do: :erlang.nif_error(:nif_not_loaded)
def pipe_transport_set_max_incoming_bitrate_async(_transport, _bitrate, _from),
do: :erlang.nif_error(:nif_not_loaded)
def pipe_transport_produce_data_async(_transport, _option, _from),
do: :erlang.nif_error(:nif_not_loaded)
def pipe_transport_get_stats_async(_transport, _from), do: :erlang.nif_error(:nif_not_loaded)
def pipe_transport_tuple(_transport), do: :erlang.nif_error(:nif_not_loaded)
def pipe_transport_sctp_parameters(_transport), do: :erlang.nif_error(:nif_not_loaded)
def pipe_transport_sctp_state(_transport), do: :erlang.nif_error(:nif_not_loaded)
def pipe_transport_srtp_parameters(_transport), do: :erlang.nif_error(:nif_not_loaded)
def pipe_transport_dump_async(_transport, _from), do: :erlang.nif_error(:nif_not_loaded)
def pipe_transport_event(_transport, _pid, _event_types),
do: :erlang.nif_error(:nif_not_loaded)
# consumer
@spec consumer_id(reference) :: String.t()
def consumer_id(_consumer), do: :erlang.nif_error(:nif_not_loaded)
@spec consumer_producer_id(reference) :: String.t()
def consumer_producer_id(_consumer), do: :erlang.nif_error(:nif_not_loaded)
@spec consumer_kind(reference) :: String.t()
def consumer_kind(_consumer), do: :erlang.nif_error(:nif_not_loaded)
@spec consumer_type(reference) :: String.t()
def consumer_type(_consumer), do: :erlang.nif_error(:nif_not_loaded)
@spec consumer_rtp_parameters(reference) :: term
def consumer_rtp_parameters(_consumer), do: :erlang.nif_error(:nif_not_loaded)
@spec consumer_close(reference) :: {:ok} | {:error}
def consumer_close(_consumer), do: :erlang.nif_error(:nif_not_loaded)
@spec consumer_closed(reference) :: boolean
def consumer_closed(_consumer), do: :erlang.nif_error(:nif_not_loaded)
@spec consumer_event(reference, pid, [atom()]) :: {:ok} | {:error}
def consumer_event(_consumer, _pid, _event_types), do: :erlang.nif_error(:nif_not_loaded)
@spec consumer_paused(reference) :: boolean
def consumer_paused(_consumer), do: :erlang.nif_error(:nif_not_loaded)
@spec consumer_producer_paused(reference) :: boolean
def consumer_producer_paused(_consumer), do: :erlang.nif_error(:nif_not_loaded)
def consumer_priority(_consumer), do: :erlang.nif_error(:nif_not_loaded)
def consumer_score(_consumer), do: :erlang.nif_error(:nif_not_loaded)
def consumer_preferred_layers(_consumer), do: :erlang.nif_error(:nif_not_loaded)
def consumer_current_layers(_consumer), do: :erlang.nif_error(:nif_not_loaded)
def consumer_get_stats_async(_consumer, _from), do: :erlang.nif_error(:nif_not_loaded)
def consumer_pause_async(_consumer, _from), do: :erlang.nif_error(:nif_not_loaded)
def consumer_resume_async(_consumer, _from), do: :erlang.nif_error(:nif_not_loaded)
def consumer_set_preferred_layers_async(_consumer, _preferred_layers, _from),
do: :erlang.nif_error(:nif_not_loaded)
def consumer_set_priority_async(_consumer, _priority, _from),
do: :erlang.nif_error(:nif_not_loaded)
def consumer_unset_priority_async(_consumer, _from), do: :erlang.nif_error(:nif_not_loaded)
def consumer_request_key_frame_async(_consumer, _from), do: :erlang.nif_error(:nif_not_loaded)
def consumer_dump_async(_consumer, _from), do: :erlang.nif_error(:nif_not_loaded)
# data_consumer
@spec data_consumer_id(reference) :: String.t()
def data_consumer_id(_consumer), do: :erlang.nif_error(:nif_not_loaded)
@spec data_consumer_producer_id(reference) :: String.t()
def data_consumer_producer_id(_consumer), do: :erlang.nif_error(:nif_not_loaded)
@spec data_consumer_type(reference) :: String.t()
def data_consumer_type(_consumer), do: :erlang.nif_error(:nif_not_loaded)
@spec data_consumer_sctp_stream_parameters(reference) :: term
def data_consumer_sctp_stream_parameters(_consumer), do: :erlang.nif_error(:nif_not_loaded)
@spec data_consumer_label(reference) :: term
def data_consumer_label(_consumer), do: :erlang.nif_error(:nif_not_loaded)
@spec data_consumer_protocol(reference) :: term
def data_consumer_protocol(_consumer), do: :erlang.nif_error(:nif_not_loaded)
@spec data_consumer_close(reference) :: {:ok} | {:error}
def data_consumer_close(_consumer), do: :erlang.nif_error(:nif_not_loaded)
@spec data_consumer_closed(reference) :: boolean
def data_consumer_closed(_consumer), do: :erlang.nif_error(:nif_not_loaded)
@spec data_consumer_event(reference, pid, [atom()]) :: {:ok} | {:error}
def data_consumer_event(_consumer, _pid, _event_types), do: :erlang.nif_error(:nif_not_loaded)
# producer
@spec producer_id(reference) :: String.t()
def producer_id(_producer), do: :erlang.nif_error(:nif_not_loaded)
@spec producer_kind(reference) :: String.t()
def producer_kind(_producer), do: :erlang.nif_error(:nif_not_loaded)
@spec producer_type(reference) :: String.t()
def producer_type(_producer), do: :erlang.nif_error(:nif_not_loaded)
@spec producer_rtp_parameters(reference) :: term()
def producer_rtp_parameters(_producer), do: :erlang.nif_error(:nif_not_loaded)
@spec producer_close(reference) :: {:ok} | {:error}
def producer_close(_consumer), do: :erlang.nif_error(:nif_not_loaded)
def producer_pause_async(_producer, _from), do: :erlang.nif_error(:nif_not_loaded)
def producer_resume_async(_producer, _from), do: :erlang.nif_error(:nif_not_loaded)
@spec producer_closed(reference) :: boolean()
def producer_closed(_producer), do: :erlang.nif_error(:nif_not_loaded)
@spec producer_paused(reference) :: boolean() | {:error}
def producer_paused(_producer), do: :erlang.nif_error(:nif_not_loaded)
@spec producer_score(reference) :: list() | {:error}
def producer_score(_producer), do: :erlang.nif_error(:nif_not_loaded)
def producer_get_stats_async(_producer, _from), do: :erlang.nif_error(:nif_not_loaded)
@spec producer_event(reference, pid, [atom()]) :: {:ok} | {:error}
def producer_event(_producer, _pid, _event_types), do: :erlang.nif_error(:nif_not_loaded)
def producer_dump_async(_producer, _from), do: :erlang.nif_error(:nif_not_loaded)
# data_producer
@spec data_producer_id(reference) :: String.t()
def data_producer_id(_producer), do: :erlang.nif_error(:nif_not_loaded)
@spec data_producer_type(reference) :: String.t()
def data_producer_type(_producer), do: :erlang.nif_error(:nif_not_loaded)
@spec data_producer_sctp_stream_parameters(reference) :: term
def data_producer_sctp_stream_parameters(_producer), do: :erlang.nif_error(:nif_not_loaded)
@spec data_producer_close(reference) :: {:ok} | {:error}
def data_producer_close(_producer), do: :erlang.nif_error(:nif_not_loaded)
@spec data_producer_closed(reference) :: boolean
def data_producer_closed(_producer), do: :erlang.nif_error(:nif_not_loaded)
@spec data_producer_event(reference, pid, [atom()]) :: {:ok} | {:error}
def data_producer_event(_producer, _pid, _event_types), do: :erlang.nif_error(:nif_not_loaded)
# logger proxy
def set_logger_proxy_process(_pid, _max_level), do: :erlang.nif_error(:nif_not_loaded)
# for test
def debug_logger(_level, _msg), do: :erlang.nif_error(:nif_not_loaded)
def init_env_logger(), do: :erlang.nif_error(:nif_not_loaded)
defp handle_async_nif_result(result) do
case result do
{:ok, result_key} ->
receive do
{^result_key, {:ok, {}}} -> {:ok}
{^result_key, msg} -> msg
end
error ->
error
end
end
def unwrap_ok({:ok, {}}), do: {:ok}
def unwrap_ok({:ok, result}), do: result
def unwrap_ok(result), do: result
end