about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMelonai <einebeere@gmail.com>2021-06-04 19:21:22 +0200
committerMelonai <einebeere@gmail.com>2021-06-04 19:21:22 +0200
commite6a567090d5e14605e6d4722fc51d7c56b9410ee (patch)
tree1deb0d7f82b60447cbe30e682a879a426b395258
parent631a39aecacf6e62ddc13ad4c8f3c81a0f5f49c7 (diff)
downloadrook-e6a567090d5e14605e6d4722fc51d7c56b9410ee.tar.zst
rook-e6a567090d5e14605e6d4722fc51d7c56b9410ee.zip
Transfer server API
-rw-r--r--assets/src/network/channel/messages/messages.ts27
-rw-r--r--lib/rook/request/actions.ex25
-rw-r--r--lib/rook/request/events.ex25
-rw-r--r--lib/rook/request/request.ex (renamed from lib/rook/request.ex)60
-rw-r--r--lib/rook/share/actions.ex25
-rw-r--r--lib/rook/share/events.ex25
-rw-r--r--lib/rook/share/share.ex (renamed from lib/rook/share.ex)61
-rw-r--r--lib/rook_web/channels/request_channel.ex12
-rw-r--r--lib/rook_web/channels/share_channel.ex18
-rw-r--r--lib/rook_web/channels/token_channel.ex2
10 files changed, 215 insertions, 65 deletions
diff --git a/assets/src/network/channel/messages/messages.ts b/assets/src/network/channel/messages/messages.ts
index 6d43a37..3f2253d 100644
--- a/assets/src/network/channel/messages/messages.ts
+++ b/assets/src/network/channel/messages/messages.ts
@@ -5,7 +5,8 @@ export type AnyMessage = ShareMessage | RequestMessage;
 export type ShareMessage =
     | NewRequestMessage
     | RequestCancelledMessage
-    | AcceptShareMessage;
+    | ShareAcceptedMessage
+    | RequestIceCandidateMessage;
 
 export type NewRequestMessage = {
     token: string;
@@ -15,16 +16,34 @@ export type RequestCancelledMessage = {
     token: string;
 };
 
-export type AcceptShareMessage = {
+export type ShareAcceptedMessage = {
     token: string;
     sdp: string;
-    type: string;
+    type: RTCSdpType;
+};
+
+export type RequestIceCandidateMessage = {
+    token: string;
+    candidate: RTCIceCandidateInit;
 };
 
 // Messages for the requestor
 
-export type RequestMessage = RequestAcknowledgedMessage | ShareCancelledMessage;
+export type RequestMessage =
+    | RequestAcknowledgedMessage
+    | RequestAcceptedMessage
+    | ShareCancelledMessage
+    | ShareIceCandidateMessage;
 
 export type RequestAcknowledgedMessage = {};
 
+export type RequestAcceptedMessage = {
+    sdp: string;
+    type: RTCSdpType;
+};
+
 export type ShareCancelledMessage = {};
+
+export type ShareIceCandidateMessage = {
+    candidate: RTCIceCandidateInit;
+};
diff --git a/lib/rook/request/actions.ex b/lib/rook/request/actions.ex
new file mode 100644
index 0000000..7c6a5d8
--- /dev/null
+++ b/lib/rook/request/actions.ex
@@ -0,0 +1,25 @@
+defmodule Rook.Request.Actions do
+  @moduledoc """
+  Defines any actions a request is able to perform.
+  Should only be called from other Request modules.
+  """
+
+  def start(token, share_token) do
+    GenServer.start(Rook.Request, [token, share_token, self()], name: via(token))
+  end
+
+  def accept_share(token, description) do
+    cast(token, {:accept_share, description})
+  end
+
+  def ice_candidate(token, candidate) do
+    cast(token, {:ice_candidate, candidate})
+  end
+
+  def close(request_token, share_token) do
+    Rook.Share.Events.request_cancelled(share_token, request_token)
+  end
+
+  defp via(name), do: {:via, Registry, {Registry.Request, name}}
+  defp cast(token, params), do: GenServer.cast(via(token), params)
+end
diff --git a/lib/rook/request/events.ex b/lib/rook/request/events.ex
new file mode 100644
index 0000000..f5f6730
--- /dev/null
+++ b/lib/rook/request/events.ex
@@ -0,0 +1,25 @@
+defmodule Rook.Request.Events do
+  @moduledoc """
+  Defines any outside events which can happen during a request's lifetime.
+  Usually called by Share modules.
+  """
+
+  def request_acknowledged(token) do
+    cast(token, {:request_acknowledged})
+  end
+
+  def request_accepted(token, description) do
+    cast(token, {:request_accepted, description})
+  end
+
+  def share_ice_candidate(token, candidate) do
+    cast(token, {:share_ice_candidate, candidate})
+  end
+
+  def share_cancelled(request_token) do
+    cast(request_token, {:share_cancelled})
+  end
+
+  defp via(name), do: {:via, Registry, {Registry.Request, name}}
+  defp cast(token, params), do: GenServer.cast(via(token), params)
+end
diff --git a/lib/rook/request.ex b/lib/rook/request/request.ex
index b795c5c..d0ee7c6 100644
--- a/lib/rook/request.ex
+++ b/lib/rook/request/request.ex
@@ -1,4 +1,9 @@
 defmodule Rook.Request do
+  @moduledoc """
+  Auxiliary process which keeps any neccessary state of any RookWeb.RequestChannel process.
+  It can be accessed either through Rook.Request.Actions or Rook.Request.Events.
+  """
+
   use GenServer
 
   defmodule State do
@@ -13,29 +18,6 @@ defmodule Rook.Request do
 
   ## Client
 
-  def init([token, share_token, channel_pid]) do
-    Process.flag(:trap_exit, true)
-    Process.link(channel_pid)
-    Rook.Share.new_request(share_token, token)
-    {:ok, %State{token: token, share_token: share_token, channel_pid: channel_pid}}
-  end
-
-  def start(token, share_token) do
-    GenServer.start(__MODULE__, [token, share_token, self()], name: via(token))
-  end
-
-  def acknowledge_request(token) do
-    cast(token, {:request_acknowledged})
-  end
-
-  def close(request_token, share_token) do
-    Rook.Share.request_cancelled(share_token, request_token)
-  end
-
-  def close(request_token) do
-    cast(request_token, {:share_cancelled})
-  end
-
   def get(token) do
     case Registry.lookup(Registry.Request, token) do
       [{pid, _}] -> pid
@@ -49,11 +31,38 @@ defmodule Rook.Request do
 
   ## Server
 
+  def init([token, share_token, channel_pid]) do
+    Process.flag(:trap_exit, true)
+    Process.link(channel_pid)
+    Rook.Share.Events.new_request(share_token, token)
+    {:ok, %State{token: token, share_token: share_token, channel_pid: channel_pid}}
+  end
+
   def handle_cast({:request_acknowledged}, state) do
     notify(state.token, "request_acknowledged", %{})
     {:noreply, state}
   end
 
+  def handle_cast({:request_accepted, description}, state) do
+    notify(state.token, "request_accepted", description)
+    {:noreply, state}
+  end
+
+  def handle_cast({:accept_share, description}, state) do
+    Rook.Share.Events.share_accepted(state.share_token, state.token, description)
+    {:noreply, state}
+  end
+
+  def handle_cast({:ice_candidate, candidate}, state) do
+    Rook.Share.Events.request_ice_candidate(state.share_token, state.token, candidate)
+    {:noreply, state}
+  end
+
+  def handle_cast({:share_ice_candidate, candidate}, state) do
+    notify(state.token, "ice_candidate", %{candidate: candidate})
+    {:noreply, state}
+  end
+
   def handle_cast({:share_cancelled}, state) do
     notify(state.token, "share_cancelled", %{})
     {:stop, :shutdown, state}
@@ -61,7 +70,7 @@ defmodule Rook.Request do
 
   def handle_info({:EXIT, pid, reason}, state) do
     if state.channel_pid == pid do
-      Rook.Request.close(state.token, state.share_token)
+      Rook.Request.Actions.close(state.token, state.share_token)
     end
 
     {:stop, reason, state}
@@ -69,9 +78,6 @@ defmodule Rook.Request do
 
   ## Helpers
 
-  defp via(name), do: {:via, Registry, {Registry.Request, name}}
-  defp cast(token, params), do: GenServer.cast(via(token), params)
-
   defp notify(token, event, params),
     do: RookWeb.Endpoint.broadcast!("request:" <> token, event, params)
 end
diff --git a/lib/rook/share/actions.ex b/lib/rook/share/actions.ex
new file mode 100644
index 0000000..b8170fd
--- /dev/null
+++ b/lib/rook/share/actions.ex
@@ -0,0 +1,25 @@
+defmodule Rook.Share.Actions do
+  @moduledoc """
+  Defines any actions a share is able to perform.
+  Should only be called from other Share modules.
+  """
+
+  def start(token) do
+    GenServer.start(Rook.Share, [token, self()], name: via(token))
+  end
+
+  def accept_request(token, request_token, description) do
+    cast(token, {:accept_request, request_token, description})
+  end
+
+  def ice_candidate(token, request_token, candidate) do
+    cast(token, {:ice_candidate, request_token, candidate})
+  end
+
+  def close(requests) do
+    Enum.each(requests, &Rook.Request.Events.share_cancelled/1)
+  end
+
+  defp via(name), do: {:via, Registry, {Registry.Share, name}}
+  defp cast(token, params), do: GenServer.cast(via(token), params)
+end
diff --git a/lib/rook/share/events.ex b/lib/rook/share/events.ex
new file mode 100644
index 0000000..4ed8619
--- /dev/null
+++ b/lib/rook/share/events.ex
@@ -0,0 +1,25 @@
+defmodule Rook.Share.Events do
+  @moduledoc """
+  Defines any outside events which can happen during a share's lifetime.
+  Usually called by Request modules.
+  """
+
+  def new_request(share_token, request_token) do
+    cast(share_token, {:new_request, request_token})
+  end
+
+  def share_accepted(share_token, request_token, description) do
+    cast(share_token, {:share_accepted, request_token, description})
+  end
+
+  def request_ice_candidate(token, request_token, candidate) do
+    cast(token, {:request_ice_candidate, request_token, candidate})
+  end
+
+  def request_cancelled(share_token, request_token) do
+    cast(share_token, {:request_cancelled, request_token})
+  end
+
+  defp via(name), do: {:via, Registry, {Registry.Share, name}}
+  defp cast(token, params), do: GenServer.cast(via(token), params)
+end
diff --git a/lib/rook/share.ex b/lib/rook/share/share.ex
index a1797ce..fe626c2 100644
--- a/lib/rook/share.ex
+++ b/lib/rook/share/share.ex
@@ -1,4 +1,9 @@
 defmodule Rook.Share do
+  @moduledoc """
+  Auxiliary process which keeps any neccessary state of any RookWeb.ShareChannel process.
+  It can be accessed either through Rook.Share.Actions or Rook.Share.Events.
+  """
+
   use GenServer
 
   defmodule State do
@@ -13,28 +18,6 @@ defmodule Rook.Share do
 
   ## Client
 
-  def init([token, channel_pid]) do
-    Process.flag(:trap_exit, true)
-    Process.link(channel_pid)
-    {:ok, %State{token: token, channel_pid: channel_pid}}
-  end
-
-  def start(token) do
-    GenServer.start(__MODULE__, [token, self()], name: via(token))
-  end
-
-  def new_request(share_token, request_token) do
-    cast(share_token, {:new_request, request_token})
-  end
-
-  def request_cancelled(share_token, request_token) do
-    cast(share_token, {:request_cancelled, request_token})
-  end
-
-  def close(requests) do
-    Enum.each(requests, &Rook.Request.close/1)
-  end
-
   def get(token) do
     case Registry.lookup(Registry.Share, token) do
       [{pid, _}] -> pid
@@ -48,6 +31,12 @@ defmodule Rook.Share do
 
   ## Server
 
+  def init([token, channel_pid]) do
+    Process.flag(:trap_exit, true)
+    Process.link(channel_pid)
+    {:ok, %State{token: token, channel_pid: channel_pid}}
+  end
+
   def handle_cast({:new_request, request_token}, state) do
     # TODO: Check whether request exists.
     %State{token: token, requests: requests} = state
@@ -55,15 +44,36 @@ defmodule Rook.Share do
     {:noreply, %{state | requests: [request_token | requests]}}
   end
 
+  def handle_cast({:accept_request, request_token, description}, state) do
+    Rook.Request.Events.request_accepted(request_token, description)
+    {:noreply, state}
+  end
+
+  def handle_cast({:share_accepted, request_token, description}, state) do
+    message = Map.put(description, :token, request_token)
+    notify(state.token, "share_accepted", message)
+    {:noreply, state}
+  end
+
+  def handle_cast({:ice_candidate, request_token, candidate}, state) do
+    Rook.Request.Events.share_ice_candidate(request_token, candidate)
+    {:noreply, state}
+  end
+
+  def handle_cast({:request_ice_candidate, request_token, candidate}, state) do
+    notify(state.token, "ice_candidate", %{token: request_token, candidate: candidate})
+    {:noreply, state}
+  end
+
   def handle_cast({:request_cancelled, request_token}, state) do
     %State{token: token, requests: requests} = state
-    notify(token, "request_cancelled", %{request: request_token})
+    notify(token, "request_cancelled", %{token: request_token})
     {:noreply, %{state | requests: List.delete(requests, request_token)}}
   end
 
   def handle_info({:EXIT, pid, reason}, state) do
     if state.channel_pid == pid do
-      Rook.Share.close(state.requests)
+      Rook.Share.Actions.close(state.requests)
     end
 
     {:stop, reason, state}
@@ -71,9 +81,6 @@ defmodule Rook.Share do
 
   ## Helpers
 
-  defp via(name), do: {:via, Registry, {Registry.Share, name}}
-  defp cast(token, params), do: GenServer.cast(via(token), params)
-
   defp notify(token, event, params),
     do: RookWeb.Endpoint.broadcast!("share:" <> token, event, params)
 end
diff --git a/lib/rook_web/channels/request_channel.ex b/lib/rook_web/channels/request_channel.ex
index 6290ae6..cc84b0f 100644
--- a/lib/rook_web/channels/request_channel.ex
+++ b/lib/rook_web/channels/request_channel.ex
@@ -4,7 +4,7 @@ defmodule RookWeb.RequestChannel do
   def join("request:" <> token, %{"share" => share_token}, socket) do
     if Rook.Token.match?(token, socket) do
       if Rook.Share.exists?(share_token) do
-        Rook.Request.start(token, share_token)
+        Rook.Request.Actions.start(token, share_token)
         {:ok, socket}
       else
         {:error, %{reason: "No such share exists."}}
@@ -17,4 +17,14 @@ defmodule RookWeb.RequestChannel do
   def join("request:" <> _token, _params, _socket) do
     {:error, %{reason: "No share given to request."}}
   end
+
+  def handle_in("accept_share", description, socket) do
+    Rook.Request.Actions.accept_share(socket.assigns.token, description)
+    {:noreply, socket}
+  end
+
+  def handle_in("ice_candidate", %{"candidate" => candidate}, socket) do
+    Rook.Request.Actions.ice_candidate(socket.assigns.token, candidate)
+    {:noreply, socket}
+  end
 end
diff --git a/lib/rook_web/channels/share_channel.ex b/lib/rook_web/channels/share_channel.ex
index 0efb3ba..02c6fc0 100644
--- a/lib/rook_web/channels/share_channel.ex
+++ b/lib/rook_web/channels/share_channel.ex
@@ -5,15 +5,17 @@ defmodule RookWeb.ShareChannel do
 
   def join("share:" <> token, _params, socket) do
     if Rook.Token.match?(token, socket) do
-      Rook.Share.start(token)
+      Rook.Share.Actions.start(token)
       {:ok, socket}
     else
       {:error, %{reason: "Wrong token."}}
     end
   end
 
-  def handle_in("accept_request", %{"request" => _request_token}, socket) do
-    # TODO: Send request accept message.
+  def handle_in("accept_request", %{"token" => request_token} = params, socket) do
+    description = Map.delete(params, :token)
+    token = socket.assigns.token
+    Rook.Share.Actions.accept_request(token, request_token, description)
     {:noreply, socket}
   end
 
@@ -21,8 +23,14 @@ defmodule RookWeb.ShareChannel do
     {:error, %{reason: "No request given to accept."}}
   end
 
-  def handle_out("new_request", %{request: request_token} = msg, socket) do
-    Rook.Request.acknowledge_request(request_token)
+  def handle_in("ice_candidate", %{"token" => request_token, "candidate" => candidate}, socket) do
+    token = socket.assigns.token
+    Rook.Share.Actions.ice_candidate(token, request_token, candidate)
+    {:noreply, socket}
+  end
+
+  def handle_out("new_request", %{token: request_token} = msg, socket) do
+    Rook.Request.Events.request_acknowledged(request_token)
     push(socket, "new_request", msg)
     {:noreply, socket}
   end
diff --git a/lib/rook_web/channels/token_channel.ex b/lib/rook_web/channels/token_channel.ex
index 72cabb1..d91b6ac 100644
--- a/lib/rook_web/channels/token_channel.ex
+++ b/lib/rook_web/channels/token_channel.ex
@@ -6,6 +6,6 @@ defmodule RookWeb.TokenChannel do
   end
 
   def handle_in("get_token", _attrs, socket) do
-    {:reply, {:ok, %{token: socket.assigns[:token]}}, socket}
+    {:reply, {:ok, %{token: socket.assigns.token}}, socket}
   end
 end