esrom/eisrom_ui/lib/eisrom_ui/morse/server.ex
2022-10-11 08:55:32 +02:00

58 lines
1.3 KiB
Elixir

defmodule Eisrom.Morse.Server do
use GenServer
def start_link(_) do
GenServer.start_link(__MODULE__, {nil, 0}, name: __MODULE__)
end
def toggle_morse do
GenServer.call(__MODULE__, :toggle)
end
def update_progress(progress) do
GenServer.cast(__MODULE__, {:progress, progress})
end
def progress do
GenServer.call(__MODULE__, :progress)
end
def in_progress? do
GenServer.call(__MODULE__, :in_progress?)
end
@impl true
def init(state) do
{:ok, state}
end
@impl true
def handle_call(:toggle, _from, {pid, _progress}) do
if worker_alive?(pid) do
EisromUi.Morse.Worker.kill(pid)
Phoenix.PubSub.broadcast(EisromUi.PubSub, "morse_progress", 0)
{:reply, :ok, {nil, 0}}
else
pid = spawn(&EisromUi.Morse.Worker.signal/0)
{:reply, :ok, {pid, 0}}
end
end
def handle_call(:progress, _from, {_pid, progress} = state) do
{:reply, progress, state}
end
def handle_call(:in_progress?, _from, {pid, _progress} = state) do
{:reply, worker_alive?(pid), state}
end
@impl true
def handle_cast({:progress, new_progress}, {pid, _progress}) do
Phoenix.PubSub.broadcast(EisromUi.PubSub, "morse_progress", new_progress)
{:noreply, {pid, new_progress}}
end
defp worker_alive?(pid) do
pid != nil and Process.alive?(pid)
end
end