Packages

High performant static blog generator.

Current section

Files

Jump to
reblog lib provider local livereload.ex
Raw

lib/provider/local/livereload.ex

defmodule Reblog.Provider.Local.Livereload do
@moduledoc """
A web socket manager used to easily manage connections to the 'local'
provider livereload option.
"""
use GenServer
require List
require Logger
# [Client]
def start_link(mapping) do
GenServer.start_link(__MODULE__, mapping)
end
@doc """
Send data to all connected clients.
"""
def send_data(server, data) do
GenServer.cast(server, {:send, data})
end
@doc """
Add client to list of connected clients.
"""
def add_client(server, client) do
GenServer.cast(server, {:add, client})
end
@doc """
Remove client from list of connected clients.
"""
def remove_client(server, client) do
GenServer.call(server, {:remove, client})
end
# [Callbacks]
def init(opts) do
self_pid = self()
{:ok, fw_pid} = Reblog.Provider.Local.Livereload.Watcher.start_link(
Map.merge(opts,
%{
send_data: &Reblog.Provider.Local.Livereload.send_data(self_pid, &1),
}))
Logger.debug(fn -> ["Process:FileWatcher@#{inspect fw_pid}"] end)
{:ok, []}
end
def handle_call({:remove, client}, _from, clients) do
{:reply, client, List.delete(clients, client)}
end
def handle_cast({:send, data}, clients) do
for client <- clients, do: Process.send_after(client, {:send, data}, 1000)
{:noreply, clients}
end
def handle_cast({:add, client}, clients) do
if Enum.member?(clients, client) do
{:noreply, clients}
else
{:noreply, clients ++ [client]}
end
end
end