diff --git a/env.d/development/common.dist b/env.d/development/common.dist index f591ed7e..42ca6092 100644 --- a/env.d/development/common.dist +++ b/env.d/development/common.dist @@ -43,3 +43,4 @@ OIDC_AUTH_REQUEST_EXTRA_PARAMS={"acr_values": "eidas1"} # Livekit Token settings LIVEKIT_API_SECRET="secret" LIVEKIT_API_KEY="devkey" +LIVEKIT_API_URL=http://localhost:7880 diff --git a/src/backend/core/api/serializers.py b/src/backend/core/api/serializers.py index 9e822388..525f2873 100644 --- a/src/backend/core/api/serializers.py +++ b/src/backend/core/api/serializers.py @@ -1,4 +1,5 @@ """Client serializers for the Meet core app.""" +from django.conf import settings from django.utils.translation import gettext_lazy as _ from rest_framework import serializers @@ -122,6 +123,7 @@ class RoomSerializer(serializers.ModelSerializer): slug = f"{instance.id!s}".replace("-", "") output["livekit"] = { + "url": settings.LIVEKIT_CONFIGURATION["url"], "room": slug, "token": utils.generate_token(room=slug, user=request.user), } diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index 3c8e5f96..add59be3 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -191,6 +191,7 @@ class RoomViewSet( data = { "id": None, "livekit": { + "url": settings.LIVEKIT_CONFIGURATION["url"], "room": slug, "token": utils.generate_token(room=slug, user=request.user), }, diff --git a/src/backend/core/tests/rooms/test_api_rooms_retrieve.py b/src/backend/core/tests/rooms/test_api_rooms_retrieve.py index 8c5b5d9e..6e21c86d 100644 --- a/src/backend/core/tests/rooms/test_api_rooms_retrieve.py +++ b/src/backend/core/tests/rooms/test_api_rooms_retrieve.py @@ -85,6 +85,13 @@ def test_api_rooms_retrieve_anonymous_private_slug_not_normalized(): @override_settings(ALLOW_UNREGISTERED_ROOMS=True) +@override_settings( + LIVEKIT_CONFIGURATION={ + "api_key": "key", + "api_secret": "secret", + "url": "test_url_value", + } +) @mock.patch("core.utils.generate_token", return_value="foo") def test_api_rooms_retrieve_anonymous_unregistered_allowed(mock_token): """ @@ -98,6 +105,7 @@ def test_api_rooms_retrieve_anonymous_unregistered_allowed(mock_token): assert response.json() == { "id": None, "livekit": { + "url": "test_url_value", "room": "unregistered-room", "token": "foo", }, @@ -107,6 +115,13 @@ def test_api_rooms_retrieve_anonymous_unregistered_allowed(mock_token): @override_settings(ALLOW_UNREGISTERED_ROOMS=True) +@override_settings( + LIVEKIT_CONFIGURATION={ + "api_key": "key", + "api_secret": "secret", + "url": "test_url_value", + } +) @mock.patch("core.utils.generate_token", return_value="foo") def test_api_rooms_retrieve_anonymous_unregistered_allowed_not_normalized(mock_token): """ @@ -120,6 +135,7 @@ def test_api_rooms_retrieve_anonymous_unregistered_allowed_not_normalized(mock_t assert response.json() == { "id": None, "livekit": { + "url": "test_url_value", "room": "reunion", "token": "foo", }, @@ -141,6 +157,13 @@ def test_api_rooms_retrieve_anonymous_unregistered_not_allowed(): @mock.patch("core.utils.generate_token", return_value="foo") +@override_settings( + LIVEKIT_CONFIGURATION={ + "api_key": "key", + "api_secret": "secret", + "url": "test_url_value", + } +) def test_api_rooms_retrieve_anonymous_public(mock_token): """ Anonymous users should be able to retrieve a room with a token provided it is public. @@ -156,6 +179,7 @@ def test_api_rooms_retrieve_anonymous_public(mock_token): "is_administrable": False, "is_public": True, "livekit": { + "url": "test_url_value", "room": expected_name, "token": "foo", }, @@ -167,6 +191,13 @@ def test_api_rooms_retrieve_anonymous_public(mock_token): @mock.patch("core.utils.generate_token", return_value="foo") +@override_settings( + LIVEKIT_CONFIGURATION={ + "api_key": "key", + "api_secret": "secret", + "url": "test_url_value", + } +) def test_api_rooms_retrieve_authenticated_public(mock_token): """ Authenticated users should be allowed to retrieve a room and get a token for a room to @@ -190,6 +221,7 @@ def test_api_rooms_retrieve_authenticated_public(mock_token): "is_administrable": False, "is_public": True, "livekit": { + "url": "test_url_value", "room": expected_name, "token": "foo", }, @@ -226,6 +258,13 @@ def test_api_rooms_retrieve_authenticated(): @mock.patch("core.utils.generate_token", return_value="foo") +@override_settings( + LIVEKIT_CONFIGURATION={ + "api_key": "key", + "api_secret": "secret", + "url": "test_url_value", + } +) def test_api_rooms_retrieve_members(mock_token, django_assert_num_queries): """ Users who are members of a room should be allowed to see related users. @@ -280,6 +319,7 @@ def test_api_rooms_retrieve_members(mock_token, django_assert_num_queries): "is_administrable": False, "is_public": room.is_public, "livekit": { + "url": "test_url_value", "room": expected_name, "token": "foo", }, @@ -291,6 +331,13 @@ def test_api_rooms_retrieve_members(mock_token, django_assert_num_queries): @mock.patch("core.utils.generate_token", return_value="foo") +@override_settings( + LIVEKIT_CONFIGURATION={ + "api_key": "key", + "api_secret": "secret", + "url": "test_url_value", + } +) def test_api_rooms_retrieve_administrators(mock_token, django_assert_num_queries): """ A user who is an administrator or owner of a room should be allowed @@ -345,6 +392,7 @@ def test_api_rooms_retrieve_administrators(mock_token, django_assert_num_queries "is_public": room.is_public, "configuration": {}, "livekit": { + "url": "test_url_value", "room": expected_name, "token": "foo", }, diff --git a/src/backend/meet/settings.py b/src/backend/meet/settings.py index 94582f68..f0328164 100755 --- a/src/backend/meet/settings.py +++ b/src/backend/meet/settings.py @@ -372,6 +372,7 @@ class Base(Configuration): "api_secret": values.Value( environ_name="LIVEKIT_API_SECRET", environ_prefix=None ), + "url": values.Value(environ_name="LIVEKIT_API_URL", environ_prefix=None), } DEFAULT_ROOM_IS_PUBLIC = values.BooleanValue( True, environ_name="DEFAULT_ROOM_IS_PUBLIC", environ_prefix=None diff --git a/src/frontend/.env.development b/src/frontend/.env.development index 520d2fb3..a22395f9 100644 --- a/src/frontend/.env.development +++ b/src/frontend/.env.development @@ -1,2 +1 @@ VITE_API_BASE_URL=http://localhost:8071/ -VITE_LIVEKIT_SERVER_URL=http://localhost:7880 diff --git a/src/frontend/src/api/ApiRoom.ts b/src/frontend/src/api/ApiRoom.ts index 548cb726..37137e57 100644 --- a/src/frontend/src/api/ApiRoom.ts +++ b/src/frontend/src/api/ApiRoom.ts @@ -4,6 +4,7 @@ export type ApiRoom = { slug: string is_public: boolean livekit?: { + url: string room: string token: string } diff --git a/src/frontend/src/routes/Conference.tsx b/src/frontend/src/routes/Conference.tsx index 4facd50f..ab45cb8a 100644 --- a/src/frontend/src/routes/Conference.tsx +++ b/src/frontend/src/routes/Conference.tsx @@ -54,11 +54,11 @@ export const Conference = () => { return } - if (data?.livekit?.token) { + if (data?.livekit?.token && data?.livekit?.url) { return ( interface ImportMetaEnv { readonly VITE_API_BASE_URL: string - readonly VITE_LIVEKIT_SERVER_URL: string } interface ImportMeta { diff --git a/src/helm/env.d/dev/values.meet.yaml.gotmpl b/src/helm/env.d/dev/values.meet.yaml.gotmpl index e4a8417f..144271fb 100644 --- a/src/helm/env.d/dev/values.meet.yaml.gotmpl +++ b/src/helm/env.d/dev/values.meet.yaml.gotmpl @@ -49,6 +49,7 @@ backend: LIVEKIT_API_KEY: {{ $key }} {{- end }} {{- end }} + LIVEKIT_API_URL: https://livekit.127.0.0.1.nip.io/ migrate: @@ -80,7 +81,6 @@ frontend: VITE_PORT: 8080 VITE_HOST: 0.0.0.0 VITE_API_BASE_URL: https://meet.127.0.0.1.nip.io/ - VITE_LIVEKIT_SERVER_URL: https://livekit.127.0.0.1.nip.io/ replicas: 1