Current section

Files

Jump to
spawn lib actors supervisors actor_projection_handler.ex
Raw

lib/actors/supervisors/actor_projection_handler.ex

defmodule Actors.Supervisors.ActorProjectionHandlerSupervisor do
@moduledoc false
use Supervisor
require Logger
import Spawn.Utils.Common, only: [supervisor_process_logger: 1]
alias Actors.Config.PersistentTermConfig, as: Config
alias Actors.Actor.Entity.Lifecycle.StreamConsumer
alias Actors.Registry.HostActor
alias Actors.Registry.ActorRegistry
def start_link(opts) do
Supervisor.start_link(__MODULE__, opts, name: __MODULE__)
end
def child_spec(opts) do
%{
id: __MODULE__,
start: {__MODULE__, :start_link, [opts]}
}
end
@impl true
def init(_opts) do
projections = :persistent_term.get("projections", [])
Logger.info("Starting projection handlers for: #{inspect(projections)}")
projection_children =
projections
|> Enum.uniq()
|> Enum.map(fn projection_name ->
config = :persistent_term.get("actor-#{projection_name}", %{})
system = Config.get(:actor_system_name)
actor_name = String.replace("#{system}-#{projection_name}", ".", "-")
%{
id: actor_name,
start:
{StreamConsumer, :start_link,
[
%{
actor_name: actor_name,
projection_pid: self(),
strict_ordering: config.strict_events_ordering
}
]}
}
end)
children =
[
supervisor_process_logger(__MODULE__)
] ++ projection_children
Supervisor.init(children, strategy: :one_for_one)
end
end