lib/tai/venues/streams_supervisor.ex

defmodule Tai.Venues.StreamsSupervisor do
  use DynamicSupervisor

  @type stream :: Tai.Venues.Stream.t()

  def start_link(_) do
    DynamicSupervisor.start_link(__MODULE__, :ok, name: __MODULE__)
  end

  @spec start(stream) :: DynamicSupervisor.on_start_child()
  def start(stream) do
    spec = {stream.venue.adapter.stream_supervisor, stream}
    DynamicSupervisor.start_child(__MODULE__, spec)
  end

  @spec stop(pid) :: :ok | {:error, :not_found}
  def stop(pid) when is_pid(pid) do
    DynamicSupervisor.terminate_child(__MODULE__, pid)
  end

  def which_children do
    DynamicSupervisor.which_children(__MODULE__)
  end

  def init(_) do
    DynamicSupervisor.init(strategy: :one_for_one)
  end
end