From 0193d0fff9565be5548a40131f6b3779bf002c17 Mon Sep 17 00:00:00 2001 From: Adrian Czerwiec Date: Mon, 28 Jul 2025 13:59:20 +0200 Subject: [PATCH 1/5] allow using the sdk with fishjam id --- .tool-versions | 2 ++ examples/room_manager/room_service.py | 5 ++--- fishjam/_ws_notifier.py | 13 +++++++++---- fishjam/api/_client.py | 10 ++++++++-- fishjam/api/_fishjam_client.py | 14 ++++++++++++-- fishjam/errors.py | 4 ++++ fishjam/utils.py | 11 +++++++++++ 7 files changed, 48 insertions(+), 11 deletions(-) create mode 100644 .tool-versions create mode 100644 fishjam/utils.py diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000..6e77e20 --- /dev/null +++ b/.tool-versions @@ -0,0 +1,2 @@ +python 3.13.5 +poetry 2.1.3 diff --git a/examples/room_manager/room_service.py b/examples/room_manager/room_service.py index 4b96ff8..fe0c220 100644 --- a/examples/room_manager/room_service.py +++ b/examples/room_manager/room_service.py @@ -24,14 +24,14 @@ class PeerAccess: room: Resource peer: Resource peer_token: str - url: str class RoomService: def __init__(self, args: Namespace, logger: Logger): self.fishjam_client = FishjamClient( - fishjam_url=args.fishjam_url, + fishjam_id=args.fishjam_id, management_token=args.management_token, + fishjam_url=args.fishjam_url, ) self.url = args.fishjam_url.replace("http", "ws") self.room_name_to_room_id: dict[str, str] = {} @@ -105,7 +105,6 @@ def __create_peer(self, room_name: str, peer_name: str) -> PeerAccess: room=Resource(id=room_id, name=room_name), peer=Resource(id=peer.id, name=peer_name), peer_token=token, - url=self.url, ) self.peer_name_to_access[peer_name] = peer_access diff --git a/fishjam/_ws_notifier.py b/fishjam/_ws_notifier.py index 762cd21..9ef16b1 100644 --- a/fishjam/_ws_notifier.py +++ b/fishjam/_ws_notifier.py @@ -21,6 +21,7 @@ ALLOWED_NOTIFICATIONS, AllowedNotification, ) +from fishjam.utils import get_fishjam_url class FishjamNotifier: @@ -28,14 +29,18 @@ class FishjamNotifier: Allows for receiving WebSocket messages from Fishjam. """ - def __init__(self, fishjam_url: str, management_token: str): + def __init__( + self, + fishjam_id: str, + management_token: str, + fishjam_url: str | None = None, + ): """ Create FishjamNotifier instance, providing the fishjam url and management token. """ - self._fishjam_url = ( - f"{fishjam_url.replace('http', 'ws')}/socket/server/websocket" - ) + websocket_url = get_fishjam_url(fishjam_id, fishjam_url).replace("http", "ws") + self._fishjam_url = f"{websocket_url}/socket/server/websocket" self._management_token: str = management_token self._websocket: client.WebSocketClientProtocol | None = None self._ready: bool = False diff --git a/fishjam/api/_client.py b/fishjam/api/_client.py index 8bb953d..d649f45 100644 --- a/fishjam/api/_client.py +++ b/fishjam/api/_client.py @@ -4,11 +4,17 @@ from fishjam._openapi_client.models import Error from fishjam._openapi_client.types import Response from fishjam.errors import HTTPError +from fishjam.utils import get_fishjam_url class Client: - def __init__(self, fishjam_url: str, management_token: str): - self.client = AuthenticatedClient(f"{fishjam_url}", token=management_token) + def __init__( + self, fishjam_id: str, management_token: str, *, fishjam_url: str | None = None + ): + self.client = AuthenticatedClient( + get_fishjam_url(fishjam_id, fishjam_url), + token=management_token, + ) def _request(self, method, **kwargs): response = method.sync_detailed(client=self.client, **kwargs) diff --git a/fishjam/api/_fishjam_client.py b/fishjam/api/_fishjam_client.py index dfa1c4c..d96cc68 100644 --- a/fishjam/api/_fishjam_client.py +++ b/fishjam/api/_fishjam_client.py @@ -82,11 +82,21 @@ class PeerOptions: class FishjamClient(Client): """Allows for managing rooms""" - def __init__(self, fishjam_url: str, management_token: str): + def __init__( + self, + fishjam_id: str, + management_token: str, + *, + fishjam_url: str | None = None, + ): """ Create FishjamClient instance, providing the fishjam url and managment token. """ - super().__init__(fishjam_url=fishjam_url, management_token=management_token) + super().__init__( + fishjam_id=fishjam_id, + management_token=management_token, + fishjam_url=fishjam_url, + ) def create_peer( self, room_id: str, options: PeerOptions | None = None diff --git a/fishjam/errors.py b/fishjam/errors.py index 0356ec7..b4fb17a 100644 --- a/fishjam/errors.py +++ b/fishjam/errors.py @@ -61,3 +61,7 @@ class InternalServerError(HTTPError): def __init__(self, errors): """@private""" super().__init__(errors) + + +class MissingFishjamIdError(Exception): + pass diff --git a/fishjam/utils.py b/fishjam/utils.py new file mode 100644 index 0000000..baf8141 --- /dev/null +++ b/fishjam/utils.py @@ -0,0 +1,11 @@ +from fishjam.errors import MissingFishjamIdError + + +def get_fishjam_url(fishjam_id: str | None, fishjam_url: str | None) -> str: + if not fishjam_url and not fishjam_id: + raise MissingFishjamIdError + + if fishjam_url: + return fishjam_url + + return f"https://fishjam.io/api/v1/connect/{fishjam_id}" From 36dfc82966fc022cba9725c92530201875d05ac1 Mon Sep 17 00:00:00 2001 From: Adrian Czerwiec Date: Mon, 28 Jul 2025 15:14:52 +0200 Subject: [PATCH 2/5] parse arguments --- examples/room_manager/arguments.py | 3 ++- examples/room_manager/room_service.py | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/room_manager/arguments.py b/examples/room_manager/arguments.py index 8ec4eb7..5248969 100644 --- a/examples/room_manager/arguments.py +++ b/examples/room_manager/arguments.py @@ -9,7 +9,8 @@ def parse_arguments(): parser.add_argument("--webhook_url", type=str, default=None) parser.add_argument("--enable_simulcast", type=str, default=True) parser.add_argument("--max_peers", type=str, default=None) - parser.add_argument("--fishjam_url", type=str, default="http://localhost:5002") + parser.add_argument("--fishjam_url", type=str, default=None) + parser.add_argument("--fishjam_id", type=str, default=None) parser.add_argument("--management_token", type=str, default="development") return parser.parse_args() diff --git a/examples/room_manager/room_service.py b/examples/room_manager/room_service.py index fe0c220..b306274 100644 --- a/examples/room_manager/room_service.py +++ b/examples/room_manager/room_service.py @@ -33,7 +33,6 @@ def __init__(self, args: Namespace, logger: Logger): management_token=args.management_token, fishjam_url=args.fishjam_url, ) - self.url = args.fishjam_url.replace("http", "ws") self.room_name_to_room_id: dict[str, str] = {} self.peer_name_to_access: dict[str, PeerAccess] = {} self.logger = logger From 1fe2ff1575f9e45968838396b18ddc847d25e17d Mon Sep 17 00:00:00 2001 From: Adrian Czerwiec Date: Mon, 28 Jul 2025 15:30:10 +0200 Subject: [PATCH 3/5] adjust tests --- tests/test_notifier.py | 13 +++++++++---- tests/test_room_api.py | 9 ++++----- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/tests/test_notifier.py b/tests/test_notifier.py index b89c649..ff23e83 100644 --- a/tests/test_notifier.py +++ b/tests/test_notifier.py @@ -24,6 +24,7 @@ HOST = "fishjam" if os.getenv("DOCKER_TEST") == "TRUE" else "localhost" FISHJAM_URL = f"http://{HOST}:5002" +FISHJAM_ID = "" SERVER_API_TOKEN = "development" WEBHOOK_ADDRESS = "test" if os.getenv("DOCKER_TEST") == "TRUE" else "localhost" WEBHOOK_URL = f"http://{WEBHOOK_ADDRESS}:5000/webhook" @@ -56,7 +57,9 @@ class TestConnectingToServer: @pytest.mark.asyncio async def test_valid_credentials(self): notifier = FishjamNotifier( - fishjam_url=FISHJAM_URL, management_token=SERVER_API_TOKEN + fishjam_id=FISHJAM_ID, + management_token=SERVER_API_TOKEN, + fishjam_url=FISHJAM_URL, ) @notifier.on_server_notification @@ -73,7 +76,7 @@ def handle_notitifcation(_notification): @pytest.mark.asyncio async def test_invalid_credentials(self): notifier = FishjamNotifier( - fishjam_url=FISHJAM_URL, management_token="wrong_token" + fishjam_id="", management_token="wrong_token", fishjam_url=FISHJAM_URL ) task = asyncio.create_task(notifier.connect()) @@ -84,13 +87,15 @@ async def test_invalid_credentials(self): @pytest.fixture def room_api(): - return FishjamClient(fishjam_url=FISHJAM_URL, management_token=SERVER_API_TOKEN) + return FishjamClient(FISHJAM_ID, SERVER_API_TOKEN, fishjam_url=FISHJAM_URL) @pytest.fixture def notifier(): notifier = FishjamNotifier( - fishjam_url=FISHJAM_URL, management_token=SERVER_API_TOKEN + fishjam_id=FISHJAM_ID, + management_token=SERVER_API_TOKEN, + fishjam_url=FISHJAM_URL, ) return notifier diff --git a/tests/test_room_api.py b/tests/test_room_api.py index b9b1f22..ada548f 100644 --- a/tests/test_room_api.py +++ b/tests/test_room_api.py @@ -26,6 +26,7 @@ HOST = "fishjam" if os.getenv("DOCKER_TEST") == "TRUE" else "localhost" FISHJAM_URL = f"http://{HOST}:5002" +FISHJAM_ID = "" MANAGEMENT_TOKEN = "development" MAX_PEERS = 10 @@ -37,15 +38,13 @@ class TestAuthentication: def test_invalid_token(self): - room_api = FishjamClient(fishjam_url=FISHJAM_URL, management_token="invalid") + room_api = FishjamClient(FISHJAM_ID, "invalid", fishjam_url=FISHJAM_URL) with pytest.raises(UnauthorizedError): room_api.create_room() def test_valid_token(self): - room_api = FishjamClient( - fishjam_url=FISHJAM_URL, management_token=MANAGEMENT_TOKEN - ) + room_api = FishjamClient(FISHJAM_ID, MANAGEMENT_TOKEN, fishjam_url=FISHJAM_URL) room = room_api.create_room() all_rooms = room_api.get_all_rooms() @@ -55,7 +54,7 @@ def test_valid_token(self): @pytest.fixture def room_api(): - return FishjamClient(fishjam_url=FISHJAM_URL, management_token=MANAGEMENT_TOKEN) + return FishjamClient(FISHJAM_ID, MANAGEMENT_TOKEN, fishjam_url=FISHJAM_URL) class TestCreateRoom: From 02573513de679337548ba90852d3a2c47c519e7f Mon Sep 17 00:00:00 2001 From: Adrian Czerwiec Date: Mon, 28 Jul 2025 16:36:44 +0200 Subject: [PATCH 4/5] add the message to the missing fishjam id error --- fishjam/api/_fishjam_client.py | 2 +- fishjam/errors.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/fishjam/api/_fishjam_client.py b/fishjam/api/_fishjam_client.py index d96cc68..2cd9908 100644 --- a/fishjam/api/_fishjam_client.py +++ b/fishjam/api/_fishjam_client.py @@ -90,7 +90,7 @@ def __init__( fishjam_url: str | None = None, ): """ - Create FishjamClient instance, providing the fishjam url and managment token. + Create a FishjamClient instance, providing the fishjam id and management token. """ super().__init__( fishjam_id=fishjam_id, diff --git a/fishjam/errors.py b/fishjam/errors.py index b4fb17a..88062f1 100644 --- a/fishjam/errors.py +++ b/fishjam/errors.py @@ -64,4 +64,6 @@ def __init__(self, errors): class MissingFishjamIdError(Exception): - pass + def __init__(self, message: str = "Missing Fishjam ID"): + """@private""" + super().__init__(message) From 82e53acc6269283fad30c8fcb273ddc127a10182 Mon Sep 17 00:00:00 2001 From: Adrian Czerwiec Date: Tue, 29 Jul 2025 10:24:08 +0200 Subject: [PATCH 5/5] fix positional fishjam id in notifier --- fishjam/_ws_notifier.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fishjam/_ws_notifier.py b/fishjam/_ws_notifier.py index 9ef16b1..96fb5eb 100644 --- a/fishjam/_ws_notifier.py +++ b/fishjam/_ws_notifier.py @@ -33,10 +33,11 @@ def __init__( self, fishjam_id: str, management_token: str, + *, fishjam_url: str | None = None, ): """ - Create FishjamNotifier instance, providing the fishjam url and management token. + Create FishjamNotifier instance, providing the fishjam id and management token. """ websocket_url = get_fishjam_url(fishjam_id, fishjam_url).replace("http", "ws")