lib/membrane_http_adaptive_stream/storages/send_storage.ex

defmodule Membrane.HTTPAdaptiveStream.Storages.SendStorage do
  @moduledoc """
  `Membrane.HTTPAdaptiveStream.Storage` implementation that sends a `t:message_t/0`
  to given destination on each call to store/remove.
  """

  @behaviour Membrane.HTTPAdaptiveStream.Storage

  @enforce_keys [:destination]
  defstruct @enforce_keys

  @type t :: %__MODULE__{
          destination: Process.dest()
        }

  @type message_t :: store_t | remove_t

  @type store_t ::
          {__MODULE__, :store,
           %{
             name: String.t(),
             contents: String.t(),
             type: :manifest | :header | :segment,
             mode: :text | :binary
           }}

  @type remove_t ::
          {__MODULE__, :remove, %{name: String.t(), type: :manifest | :header | :segment}}

  @impl true
  def init(%__MODULE__{} = config), do: config

  @impl true
  def store(name, contents, context, %__MODULE__{destination: destination}) do
    send(destination, {__MODULE__, :store, Map.merge(context, %{name: name, contents: contents})})
    :ok
  end

  @impl true
  def remove(name, context, %__MODULE__{destination: destination}) do
    send(destination, {__MODULE__, :remove, Map.merge(context, %{name: name})})
    :ok
  end
end