Current section

Files

Jump to
ex_esdb lib repl monitor.ex
Raw

lib/repl/monitor.ex

defmodule ExESDB.Repl.EventStreamMonitor do
@moduledoc false
use GenServer
require Logger
alias ExESDB.Themes, as: Themes
alias Phoenix.PubSub, as: PubSub
def start do
opts = ExESDB.Options.app_env()
case start_link(opts) do
{:ok, pid} ->
Logger.info("Monitor started with pid #{inspect(pid)}")
pid
{:error, {:already_started, pid}} ->
IO.puts "Monitor already started with pid #{inspect(pid)}"
pid
{:error, reason} -> raise "Failed to start monitor. Reason: #{inspect(reason)}"
end
end
defp subscribe(opts) do
store_id = inspect(opts[:store_id])
case opts[:pub_sub]
|> PubSub.subscribe(store_id) do
:ok -> Logger.info("#{Themes.monitor(self())} => Subscribed to #{inspect(opts[:store_id], pretty: true)}")
error -> Logger.error("#{Themes.monitor(self())} => Failed to subscribe to #{inspect(opts[:store_id], pretty: true)}. Reason: #{inspect(error)}")
end
end
@impl true
def handle_info({:event_seen, event}, state) do
IO.puts "Seen event #{inspect event}"
{:noreply, state}
end
@impl true
def handle_info(unknown, state) do
IO.puts "Unknown message #{inspect unknown}"
{:noreply, state}
end
@impl true
def init(opts) do
Logger.info("#{Themes.monitor(self())} => Starting monitor for #{inspect(opts[:store_id], pretty: true)}")
subscribe(opts)
{:ok, opts}
end
def start_link(args) do
GenServer.start_link(
__MODULE__,
args,
name: __MODULE__
)
end
def child_spec(opts) do
%{
id: __MODULE__,
start: {__MODULE__, :start_link, [opts]},
restart: :permanent,
shutdown: 5000,
type: :worker,
}
end
end