lib/membrane_rtc_engine/message.ex

defmodule Membrane.RTC.Engine.Message do
  @moduledoc """
  Module describing messages RTC Engine can emit.

  Each Message contains RTC Engine PID under `rtc_engine` field.
  Thanks to it you can distinguish between the same messages but from different RTC Engine instances.
  """
  alias Membrane.RTC.Engine.Peer

  @type t() :: __MODULE__.MediaEvent.t() | __MODULE__.NewPeer.t() | __MODULE__.PeerLeft.t()

  defmodule MediaEvent do
    @moduledoc """
    Message emitted when RTC Engine needs to send some Media Event to the Client Library.
    """

    @typedoc """
    Describes MediaEvent Message structure.

    * `rtc_engine` - pid of RTC Engine instance which emitted this message
    * `to` - informs where this Media Event should be sent. If set to `:broadcast`, the Media Event
    should be sent to all peers. When set to `t:Membrane.RTC.Engine.Peer.id()`, the Media Event
    should be sent to that specified peer.
    * `data` - Media Event in serialized i.e. binary form
    """
    @type t() :: %__MODULE__{
            rtc_engine: pid(),
            to: Peer.id() | :broadcast,
            data: binary()
          }
    @enforce_keys [:rtc_engine, :to, :data]
    defstruct @enforce_keys
  end

  defmodule NewPeer do
    @moduledoc """
    Message emitted when a new peer from Client Library tries to join RTC Engine.

    You can reply to this message using: `Membrane.RTC.Engine.accept_peer/2` and
    `Membrane.RTC.Engine.deny_peer/2` or `Membrane.RTC.Engine.deny_peer/3`.
    """

    @typedoc """
    Describes NewPeer Message structure.

    * `rtc_engine` - pid of RTC Engine instance which emitted this message
    * `peer` - peer that tries to join to RTC Engine
    """
    @type t() :: %__MODULE__{
            rtc_engine: pid(),
            peer: Peer.t()
          }

    @enforce_keys [:rtc_engine, :peer]
    defstruct @enforce_keys
  end

  defmodule PeerLeft do
    @moduledoc """
    Message emitted when a peer left RTC Engine.
    """

    @typedoc """
    Describes PeerLeft Message structure.

    * `rtc_engine` - pid of RTC Engine instance which emitted this message
    * `peer` - peer that left RTC Engine
    """
    @type t() :: %__MODULE__{
            rtc_engine: pid(),
            peer: Peer.t()
          }

    @enforce_keys [:rtc_engine, :peer]
    defstruct @enforce_keys
  end

  defmodule EndpointCrashed do
    @moduledoc """
    Message emitted when an endpoint crashes.
    """

    @typedoc """
    Describes EndpointCrashed Message structure.

    * `endpoint_id` - id of an endpoint that crashed
    """
    @type t() :: %__MODULE__{
            endpoint_id: any()
          }

    @enforce_keys [:endpoint_id]
    defstruct @enforce_keys
  end
end