Skip to main content

lib/commanded/event_store/adapters/eventsourcingdb/supervisor.ex

defmodule Commanded.EventStore.Adapters.EventSourcingDB.Supervisor do
  @moduledoc false

  use Supervisor

  alias Commanded.EventStore.Adapters.EventSourcingDB.CheckpointStore
  alias Commanded.EventStore.Adapters.EventSourcingDB.Config
  alias Commanded.EventStore.Adapters.EventSourcingDB.EventPublisher
  alias Commanded.EventStore.Adapters.EventSourcingDB.SubscriptionSupervisor

  def start_link(config) do
    event_store = Keyword.fetch!(config, :event_store)
    name = Module.concat([event_store, Supervisor])

    Supervisor.start_link(__MODULE__, config, name: name)
  end

  @impl Supervisor
  def init(config) do
    client_config = Keyword.fetch!(config, :client)
    client = Config.client(client_config)
    stream_prefix = Keyword.get(config, :stream_prefix, "")
    event_store = Keyword.fetch!(config, :event_store)

    CheckpointStore.init()

    pubsub_name = Module.concat([event_store, PubSub])
    observer_registry_name = Module.concat([event_store, ObserverRegistry])
    event_publisher_name = Module.concat([event_store, EventPublisher])
    subscription_supervisor_name = Module.concat([event_store, SubscriptionSupervisor])

    children = [
      {Registry, keys: :duplicate, name: pubsub_name, partitions: 1},
      {Registry, keys: :duplicate, name: observer_registry_name, partitions: 1},
      %{
        id: EventPublisher,
        start:
          {EventPublisher, :start_link,
           [
             {client, event_store, pubsub_name, observer_registry_name, stream_prefix},
             [name: event_publisher_name]
           ]},
        restart: :permanent,
        shutdown: 5_000,
        type: :worker
      },
      %{
        id: SubscriptionSupervisor,
        start:
          {SubscriptionSupervisor, :start_link,
           [
             [client: client, event_store: event_store, stream_prefix: stream_prefix],
             [name: subscription_supervisor_name]
           ]},
        restart: :permanent,
        shutdown: 5_000,
        type: :supervisor
      }
    ]

    Supervisor.init(children, strategy: :one_for_one)
  end
end