about summary refs log tree commit diff
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