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/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..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, Application.fetch_env!(:jellyfish, :address)}, state} + {:reply, {:ok, room, Jellyfish.address()}, state} else {:error, :room_already_exists} = error -> {:reply, error, state} 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/lib/jellyfish_web/controllers/peer_controller.ex b/lib/jellyfish_web/controllers/peer_controller.ex index 104360af..4be11780 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.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/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: diff --git a/test/jellyfish_web/controllers/peer_controller_test.exs b/test/jellyfish_web/controllers/peer_controller_test.exs index 0d1de567..81d33c7d 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.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}")