diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/rook/application.ex | 3 | ||||
| -rw-r--r-- | lib/rook/monitors/share_monitor.ex | 34 | ||||
| -rw-r--r-- | lib/rook_web/channels/share_channel.ex | 5 |
3 files changed, 41 insertions, 1 deletions
diff --git a/lib/rook/application.ex b/lib/rook/application.ex index 71fdf24..c54e6d2 100644 --- a/lib/rook/application.ex +++ b/lib/rook/application.ex @@ -12,9 +12,10 @@ defmodule Rook.Application do # Start the PubSub system {Phoenix.PubSub, name: Rook.PubSub}, # Start the Endpoint (http/https) - RookWeb.Endpoint + RookWeb.Endpoint, # Start a worker by calling: Rook.Worker.start_link(arg) # {Rook.Worker, arg} + Rook.ShareMonitor ] # See https://hexdocs.pm/elixir/Supervisor.html diff --git a/lib/rook/monitors/share_monitor.ex b/lib/rook/monitors/share_monitor.ex new file mode 100644 index 0000000..0dd1730 --- /dev/null +++ b/lib/rook/monitors/share_monitor.ex @@ -0,0 +1,34 @@ +defmodule Rook.ShareMonitor do + use GenServer + + def track(pid, token) do + GenServer.call(__MODULE__, {:track, pid, token}) + end + + def start_link(_) do + GenServer.start_link(__MODULE__, [], name: __MODULE__) + end + + def init(_) do + Process.flag(:trap_exit, true) + {:ok, {%{}, %{}}} + end + + def handle_call({:track, pid, token}, _from, {pids, channels}) do + Process.link(pid) + + {:reply, :ok, {Map.put(pids, pid, token), Map.put(channels, token, {pid, []})}} + end + + def handle_info({:EXIT, pid, _reason}, {pids, channels}) do + case Map.fetch(pids, pid) do + :error -> + {:noreply, {pids, channels}} + + {:ok, token} -> + {_, requests} = Map.fetch!(channels, token) + RookWeb.ShareChannel.handle_close(requests) + {:noreply, {Map.delete(pids, pid), Map.delete(channels, token)}} + end + end +end diff --git a/lib/rook_web/channels/share_channel.ex b/lib/rook_web/channels/share_channel.ex index fde0096..7454986 100644 --- a/lib/rook_web/channels/share_channel.ex +++ b/lib/rook_web/channels/share_channel.ex @@ -3,9 +3,14 @@ defmodule RookWeb.ShareChannel do def join("share:" <> token, _params, socket) do if token == socket.assigns[:token] do + :ok = Rook.ShareMonitor.track(self(), token) {:ok, socket} else {:error, %{reason: "Wrong token."}} end end + + def handle_close(_requests) do + # Notify all requests that share is gone. + end end |
