From 2477d7adfd8309cea6c8e214789a78f4111f22df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Szuma?= Date: Tue, 16 Apr 2024 12:16:28 +0200 Subject: [PATCH 1/4] Return peer_websocket_url in peer creation --- lib/jellyfish/application.ex | 10 ++++++++++ lib/jellyfish/resource_manager.ex | 11 +++++++++++ lib/jellyfish/room_service.ex | 2 +- .../controllers/peer_controller.ex | 6 +++++- lib/jellyfish_web/controllers/peer_json.ex | 4 ++-- .../controllers/peer_controller_test.exs | 17 +++++++++++++---- 6 files changed, 42 insertions(+), 8 deletions(-) diff --git a/lib/jellyfish/application.ex b/lib/jellyfish/application.ex index 8e24612b..55aa9b7b 100644 --- a/lib/jellyfish/application.ex +++ b/lib/jellyfish/application.ex @@ -75,6 +75,16 @@ defmodule Jellyfish.Application do :ok end + @spec get_jellyfish_address() :: binary() + def get_jellyfish_address() do + Application.fetch_env!(:jellyfish, :address) + end + + @spec get_peer_websocket_address() :: binary() + def get_peer_websocket_address() do + Application.fetch_env!(:jellyfish, :address) <> "/socket/peer" + end + defp config_distribution(dist_config) do :ok = ensure_epmd_started!() diff --git a/lib/jellyfish/resource_manager.ex b/lib/jellyfish/resource_manager.ex index 5e5e0f1f..e164c4d5 100644 --- a/lib/jellyfish/resource_manager.ex +++ b/lib/jellyfish/resource_manager.ex @@ -26,6 +26,17 @@ defmodule Jellyfish.ResourceManager do def init(opts) do Logger.debug("Initialize resource manager") + base_path = Recording.get_base_path() + dir_result = File.mkdir_p(base_path) + + case dir_result do + {:error, reason} -> + Logger.error("Can't create directory at #{base_path} with reason: #{reason}") + + :ok -> + nil + end + schedule_free_resources(opts.interval) {:ok, opts} diff --git a/lib/jellyfish/room_service.ex b/lib/jellyfish/room_service.ex index c8577c8c..ebcbf4fb 100644 --- a/lib/jellyfish/room_service.ex +++ b/lib/jellyfish/room_service.ex @@ -146,7 +146,7 @@ defmodule Jellyfish.RoomService do Event.broadcast_server_notification({:room_created, room_id}) - {:reply, {:ok, room, Application.fetch_env!(:jellyfish, :address)}, state} + {:reply, {:ok, room, Jellyfish.Application.get_jellyfish_address()}, state} else {:error, :room_already_exists} = error -> {:reply, error, state} diff --git a/lib/jellyfish_web/controllers/peer_controller.ex b/lib/jellyfish_web/controllers/peer_controller.ex index 104360af..e0ee0bba 100644 --- a/lib/jellyfish_web/controllers/peer_controller.ex +++ b/lib/jellyfish_web/controllers/peer_controller.ex @@ -74,7 +74,11 @@ defmodule JellyfishWeb.PeerController do {:ok, peer_type} <- Peer.parse_type(peer_type_string), {:ok, _room_pid} <- RoomService.find_room(room_id), {:ok, peer} <- Room.add_peer(room_id, peer_type, peer_options) do - assigns = [peer: peer, token: PeerToken.generate(%{peer_id: peer.id, room_id: room_id})] + assigns = [ + peer: peer, + token: PeerToken.generate(%{peer_id: peer.id, room_id: room_id}), + peer_websocket_url: Jellyfish.Application.get_peer_websocket_address() + ] conn |> put_resp_content_type("application/json") diff --git a/lib/jellyfish_web/controllers/peer_json.ex b/lib/jellyfish_web/controllers/peer_json.ex index f4f87397..974afee2 100644 --- a/lib/jellyfish_web/controllers/peer_json.ex +++ b/lib/jellyfish_web/controllers/peer_json.ex @@ -2,8 +2,8 @@ defmodule JellyfishWeb.PeerJSON do @moduledoc false alias Jellyfish.Peer.WebRTC - def show(%{peer: peer, token: token}) do - %{data: %{peer: data(peer), token: token}} + def show(%{peer: peer, token: token, peer_websocket_url: ws_url}) do + %{data: %{peer: data(peer), token: token, peer_websocket_url: ws_url}} end def show(%{peer: peer}) do diff --git a/test/jellyfish_web/controllers/peer_controller_test.exs b/test/jellyfish_web/controllers/peer_controller_test.exs index 0d1de567..7f67111d 100644 --- a/test/jellyfish_web/controllers/peer_controller_test.exs +++ b/test/jellyfish_web/controllers/peer_controller_test.exs @@ -22,17 +22,26 @@ defmodule JellyfishWeb.PeerControllerTest do assert response(conn, :no_content) end) - {:ok, %{conn: conn, room_id: id}} + peer_ws_url = Jellyfish.Application.get_peer_websocket_address() + + {:ok, %{conn: conn, room_id: id, peer_ws_url: peer_ws_url}} end describe "create peer" do - test "renders peer when data is valid", %{conn: conn, room_id: room_id} do + test "renders peer when data is valid", %{ + conn: conn, + room_id: room_id, + peer_ws_url: peer_ws_url + } do conn = post(conn, ~p"/room/#{room_id}/peer", type: @peer_type) response = json_response(conn, :created) assert_response_schema(response, "PeerDetailsResponse", @schema) - assert %{"peer" => %{"id" => peer_id, "type" => @peer_type}, "token" => token} = - response["data"] + assert %{ + "peer" => %{"id" => peer_id, "type" => @peer_type}, + "token" => token, + "peer_websocket_url" => ^peer_ws_url + } = response["data"] conn = get(conn, ~p"/room/#{room_id}") From 58010ede0d91fecebd3a593e3e5fc14bfc9ca1d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Szuma?= Date: Tue, 16 Apr 2024 12:33:49 +0200 Subject: [PATCH 2/4] Fix OpenAPI spec --- lib/jellyfish_web/api_spec/peer.ex | 13 +++++++++++++ lib/jellyfish_web/api_spec/responses.ex | 6 +++++- openapi.yaml | 8 ++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/lib/jellyfish_web/api_spec/peer.ex b/lib/jellyfish_web/api_spec/peer.ex index a44a63fd..3f2c1b6d 100644 --- a/lib/jellyfish_web/api_spec/peer.ex +++ b/lib/jellyfish_web/api_spec/peer.ex @@ -61,6 +61,19 @@ defmodule JellyfishWeb.ApiSpec.Peer do }) end + defmodule WebSocketUrl do + @moduledoc false + + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "WebsocketURL", + description: "Websocket URL to which peer has to connect", + type: :string, + example: "www.jellyfish.org/socket/peer" + }) + end + defmodule PeerMetadata do @moduledoc false diff --git a/lib/jellyfish_web/api_spec/responses.ex b/lib/jellyfish_web/api_spec/responses.ex index a710032b..e8237e17 100644 --- a/lib/jellyfish_web/api_spec/responses.ex +++ b/lib/jellyfish_web/api_spec/responses.ex @@ -2,7 +2,11 @@ {PeerDetailsResponse, "Response containing peer details and their token", %OpenApiSpex.Schema{ type: :object, - properties: %{peer: JellyfishWeb.ApiSpec.Peer, token: JellyfishWeb.ApiSpec.Peer.Token}, + properties: %{ + peer: JellyfishWeb.ApiSpec.Peer, + token: JellyfishWeb.ApiSpec.Peer.Token, + peer_websocket_url: JellyfishWeb.ApiSpec.Peer.WebSocketUrl + }, required: [:peer, :token] }}, {RoomDetailsResponse, "Response containing room details", JellyfishWeb.ApiSpec.Room}, diff --git a/openapi.yaml b/openapi.yaml index 42dbbcaa..d9ca2bb3 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -397,6 +397,12 @@ components: title: HlsPart type: integer x-struct: Elixir.JellyfishWeb.ApiSpec.HLS.Params.HlsPart + WebsocketURL: + description: Websocket URL to which peer has to connect + example: www.jellyfish.org/socket/peer + title: WebsocketURL + type: string + x-struct: Elixir.JellyfishWeb.ApiSpec.Peer.WebSocketUrl ComponentDetailsResponse: description: Response containing component details properties: @@ -681,6 +687,8 @@ components: properties: peer: $ref: '#/components/schemas/Peer' + peer_websocket_url: + $ref: '#/components/schemas/WebsocketURL' token: $ref: '#/components/schemas/AuthToken' required: From e57992e7982024a832d7ec9973a4b6fd43dfe2ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Szuma?= Date: Tue, 16 Apr 2024 14:37:51 +0200 Subject: [PATCH 3/4] Fix get_peer_websocket_address --- lib/jellyfish/application.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jellyfish/application.ex b/lib/jellyfish/application.ex index 55aa9b7b..ad70691a 100644 --- a/lib/jellyfish/application.ex +++ b/lib/jellyfish/application.ex @@ -82,7 +82,7 @@ defmodule Jellyfish.Application do @spec get_peer_websocket_address() :: binary() def get_peer_websocket_address() do - Application.fetch_env!(:jellyfish, :address) <> "/socket/peer" + Application.fetch_env!(:jellyfish, :address) <> "/socket/peer/websocket" end defp config_distribution(dist_config) do From e9b39a5dcc974c1cd8d150145e433000995bd570 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Szuma?= Date: Wed, 17 Apr 2024 09:50:12 +0200 Subject: [PATCH 4/4] Move new code from application.ex to jellyfish.ex --- lib/jellyfish.ex | 10 ++++++++++ lib/jellyfish/application.ex | 10 ---------- lib/jellyfish/room_service.ex | 2 +- lib/jellyfish_web/controllers/peer_controller.ex | 2 +- .../jellyfish_web/controllers/peer_controller_test.exs | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/jellyfish.ex b/lib/jellyfish.ex index 52a1505a..144ed968 100644 --- a/lib/jellyfish.ex +++ b/lib/jellyfish.ex @@ -10,4 +10,14 @@ defmodule Jellyfish do @version Mix.Project.config()[:version] def version(), do: @version + + @spec address() :: binary() + def address() do + Application.fetch_env!(:jellyfish, :address) + end + + @spec peer_websocket_address() :: binary() + def peer_websocket_address() do + Application.fetch_env!(:jellyfish, :address) <> "/socket/peer/websocket" + end end diff --git a/lib/jellyfish/application.ex b/lib/jellyfish/application.ex index ad70691a..8e24612b 100644 --- a/lib/jellyfish/application.ex +++ b/lib/jellyfish/application.ex @@ -75,16 +75,6 @@ defmodule Jellyfish.Application do :ok end - @spec get_jellyfish_address() :: binary() - def get_jellyfish_address() do - Application.fetch_env!(:jellyfish, :address) - end - - @spec get_peer_websocket_address() :: binary() - def get_peer_websocket_address() do - Application.fetch_env!(:jellyfish, :address) <> "/socket/peer/websocket" - end - defp config_distribution(dist_config) do :ok = ensure_epmd_started!() diff --git a/lib/jellyfish/room_service.ex b/lib/jellyfish/room_service.ex index ebcbf4fb..379f1fa5 100644 --- a/lib/jellyfish/room_service.ex +++ b/lib/jellyfish/room_service.ex @@ -146,7 +146,7 @@ defmodule Jellyfish.RoomService do Event.broadcast_server_notification({:room_created, room_id}) - {:reply, {:ok, room, Jellyfish.Application.get_jellyfish_address()}, state} + {:reply, {:ok, room, Jellyfish.address()}, state} else {:error, :room_already_exists} = error -> {:reply, error, state} diff --git a/lib/jellyfish_web/controllers/peer_controller.ex b/lib/jellyfish_web/controllers/peer_controller.ex index e0ee0bba..4be11780 100644 --- a/lib/jellyfish_web/controllers/peer_controller.ex +++ b/lib/jellyfish_web/controllers/peer_controller.ex @@ -77,7 +77,7 @@ defmodule JellyfishWeb.PeerController do assigns = [ peer: peer, token: PeerToken.generate(%{peer_id: peer.id, room_id: room_id}), - peer_websocket_url: Jellyfish.Application.get_peer_websocket_address() + peer_websocket_url: Jellyfish.peer_websocket_address() ] conn diff --git a/test/jellyfish_web/controllers/peer_controller_test.exs b/test/jellyfish_web/controllers/peer_controller_test.exs index 7f67111d..81d33c7d 100644 --- a/test/jellyfish_web/controllers/peer_controller_test.exs +++ b/test/jellyfish_web/controllers/peer_controller_test.exs @@ -22,7 +22,7 @@ defmodule JellyfishWeb.PeerControllerTest do assert response(conn, :no_content) end) - peer_ws_url = Jellyfish.Application.get_peer_websocket_address() + peer_ws_url = Jellyfish.peer_websocket_address() {:ok, %{conn: conn, room_id: id, peer_ws_url: peer_ws_url}} end