defmodule Jellyfish.Component do
@moduledoc """
Defines `t:Jellyfish.Component.t/0`.
Component is a server-side entity that can publish, subscribe to and process tracks.
For more information refer to [Jellyfish documentation](https://jellyfish-dev.github.io/jellyfish-docs/introduction/basic_concepts).
"""
alias Jellyfish.Component.{HLS, RTSP}
alias Jellyfish.Exception.StructureError
@enforce_keys [
:id,
:type,
:metadata
]
defstruct @enforce_keys
@typedoc """
Id of the component, unique within the room.
"""
@type id :: String.t()
@typedoc """
Type of the component.
"""
@type type :: HLS | RTSP
@typedoc """
Component-specific options.
"""
@type options :: HLS.t() | RTSP.t()
@typedoc """
Stores information about the component.
"""
@type t :: %__MODULE__{
id: id(),
type: type(),
metadata: map()
}
@doc false
@spec from_json(map()) :: t()
def from_json(response) do
case response do
%{
"id" => id,
"type" => type_str,
"metadata" => metadata
} ->
type = type_from_string(type_str)
%__MODULE__{
id: id,
type: type,
metadata: type.metadata_from_json(metadata)
}
_other ->
raise StructureError
end
end
@doc false
@spec string_from_options(struct()) :: String.t()
def string_from_options(%HLS{}), do: "hls"
def string_from_options(%RTSP{}), do: "rtsp"
defp type_from_string("hls"), do: HLS
defp type_from_string("rtsp"), do: RTSP
end