Skip to main content

lib/pi/agent/job_supervisor.ex

defmodule Pi.Agent.JobSupervisor do
  @moduledoc "Dynamic supervisor for BEAM-owned agent jobs."

  use DynamicSupervisor

  alias Pi.Supervisor.Install

  def start_link(opts \\ []), do: Install.start_link(__MODULE__, opts)

  def install, do: Install.dynamic(__MODULE__)

  def start_job(job, opts) do
    install()

    DynamicSupervisor.start_child(
      __MODULE__,
      Supervisor.child_spec({Pi.Agent.Job, {job, opts}},
        id: {Pi.Agent.Job, job.id},
        restart: :temporary
      )
    )
  end

  @impl true
  def init(_opts), do: DynamicSupervisor.init(strategy: :one_for_one)
end