aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/rook/application.ex3
-rw-r--r--lib/rook/monitors/share_monitor.ex34
-rw-r--r--lib/rook_web/channels/share_channel.ex5
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