defmodule Fly.Postgres.LSN.Supervisor do
# Automatically defines child_spec/1
use Supervisor
alias Fly.Postgres.LSN.Tracker
alias Fly.Postgres.LSN.Reader
def start_link(opts \\ []) do
if !Keyword.has_key?(opts, :repo) do
raise ArgumentError, ":repo is required when starting the LSN tracking processes"
end
name = Keyword.get(opts, :name, __MODULE__)
base_name = Keyword.get(opts, :name, Core.LSN)
Supervisor.start_link(__MODULE__, Keyword.put(opts, :base_name, base_name), name: name)
end
@impl true
def init(opts) do
repo_module = Keyword.get(opts, :repo)
base_name = Keyword.get(opts, :base_name)
children = [
{Tracker, [repo: repo_module, base_name: base_name]},
{Reader, [repo: repo_module, base_name: base_name]}
]
# if the Tracker process dies, restart the reader
Supervisor.init(children, strategy: :rest_for_one)
end
end