Current section
Files
Jump to
Current section
Files
lib/visitor_session/visitor_session_supervisor.ex
defmodule Kandis.VisitorSessionSupervisor do
use DynamicSupervisor
alias Kandis.VisitorSessionGenServer
import Kandis.KdHelpers, warn: false
@registry :kandis_visitor_session_registry
def start_link(_arg),
do: DynamicSupervisor.start_link(__MODULE__, [], name: __MODULE__)
def init(_arg),
do: DynamicSupervisor.init(strategy: :one_for_one)
@doc false
def find_or_create_child(sid) when is_binary(sid) do
case get_pid_of_child(sid) do
nil ->
case create_child(sid) do
{:ok, pid} -> pid
_ -> nil
end
pid ->
pid
end
end
@doc false
def get_pid_of_child(sid) when is_binary(sid) do
case Registry.lookup(@registry, sid) do
[{pid, _}] -> pid
[] -> nil
end
end
@doc false
def create_child(sid) when is_binary(sid) do
spec = %{
id: VisitorSessionGenServer,
start: {VisitorSessionGenServer, :start_link, [sid]},
restart: :temporary
}
case DynamicSupervisor.start_child(__MODULE__, spec) do
{:ok, pid} ->
pid
|> log("created child for #{sid} with PID: ")
{:ok, pid}
{:error, {:already_started, pid}} ->
{:error, :process_already_exists, pid}
other ->
{:error, other}
end
end
end