Skip to content

Commit 8fed963

Browse files
authored
Add refresh peer token to FishjamClient API (#12)
1 parent 281ee3c commit 8fed963

File tree

6 files changed

+342
-2
lines changed

6 files changed

+342
-2
lines changed
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
from http import HTTPStatus
2+
from typing import Any, Dict, Optional, Union
3+
4+
import httpx
5+
6+
from ... import errors
7+
from ...client import AuthenticatedClient, Client
8+
from ...models.error import Error
9+
from ...models.peer_refresh_token_response import PeerRefreshTokenResponse
10+
from ...types import Response
11+
12+
13+
def _get_kwargs(
14+
room_id: str,
15+
id: str,
16+
) -> Dict[str, Any]:
17+
return {
18+
"method": "post",
19+
"url": "/room/{room_id}/peer/{id}/refresh_token".format(
20+
room_id=room_id,
21+
id=id,
22+
),
23+
}
24+
25+
26+
def _parse_response(
27+
*, client: Union[AuthenticatedClient, Client], response: httpx.Response
28+
) -> Optional[Union[Error, PeerRefreshTokenResponse]]:
29+
if response.status_code == HTTPStatus.CREATED:
30+
response_201 = PeerRefreshTokenResponse.from_dict(response.json())
31+
32+
return response_201
33+
if response.status_code == HTTPStatus.BAD_REQUEST:
34+
response_400 = Error.from_dict(response.json())
35+
36+
return response_400
37+
if response.status_code == HTTPStatus.UNAUTHORIZED:
38+
response_401 = Error.from_dict(response.json())
39+
40+
return response_401
41+
if response.status_code == HTTPStatus.NOT_FOUND:
42+
response_404 = Error.from_dict(response.json())
43+
44+
return response_404
45+
if response.status_code == HTTPStatus.SERVICE_UNAVAILABLE:
46+
response_503 = Error.from_dict(response.json())
47+
48+
return response_503
49+
if client.raise_on_unexpected_status:
50+
raise errors.UnexpectedStatus(response.status_code, response.content)
51+
else:
52+
return None
53+
54+
55+
def _build_response(
56+
*, client: Union[AuthenticatedClient, Client], response: httpx.Response
57+
) -> Response[Union[Error, PeerRefreshTokenResponse]]:
58+
return Response(
59+
status_code=HTTPStatus(response.status_code),
60+
content=response.content,
61+
headers=response.headers,
62+
parsed=_parse_response(client=client, response=response),
63+
)
64+
65+
66+
def sync_detailed(
67+
room_id: str,
68+
id: str,
69+
*,
70+
client: AuthenticatedClient,
71+
) -> Response[Union[Error, PeerRefreshTokenResponse]]:
72+
"""Refresh peer token
73+
74+
Args:
75+
room_id (str):
76+
id (str):
77+
78+
Raises:
79+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
80+
httpx.TimeoutException: If the request takes longer than Client.timeout.
81+
82+
Returns:
83+
Response[Union[Error, PeerRefreshTokenResponse]]
84+
"""
85+
86+
kwargs = _get_kwargs(
87+
room_id=room_id,
88+
id=id,
89+
)
90+
91+
response = client.get_httpx_client().request(
92+
**kwargs,
93+
)
94+
95+
return _build_response(client=client, response=response)
96+
97+
98+
def sync(
99+
room_id: str,
100+
id: str,
101+
*,
102+
client: AuthenticatedClient,
103+
) -> Optional[Union[Error, PeerRefreshTokenResponse]]:
104+
"""Refresh peer token
105+
106+
Args:
107+
room_id (str):
108+
id (str):
109+
110+
Raises:
111+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
112+
httpx.TimeoutException: If the request takes longer than Client.timeout.
113+
114+
Returns:
115+
Union[Error, PeerRefreshTokenResponse]
116+
"""
117+
118+
return sync_detailed(
119+
room_id=room_id,
120+
id=id,
121+
client=client,
122+
).parsed
123+
124+
125+
async def asyncio_detailed(
126+
room_id: str,
127+
id: str,
128+
*,
129+
client: AuthenticatedClient,
130+
) -> Response[Union[Error, PeerRefreshTokenResponse]]:
131+
"""Refresh peer token
132+
133+
Args:
134+
room_id (str):
135+
id (str):
136+
137+
Raises:
138+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
139+
httpx.TimeoutException: If the request takes longer than Client.timeout.
140+
141+
Returns:
142+
Response[Union[Error, PeerRefreshTokenResponse]]
143+
"""
144+
145+
kwargs = _get_kwargs(
146+
room_id=room_id,
147+
id=id,
148+
)
149+
150+
response = await client.get_async_httpx_client().request(**kwargs)
151+
152+
return _build_response(client=client, response=response)
153+
154+
155+
async def asyncio(
156+
room_id: str,
157+
id: str,
158+
*,
159+
client: AuthenticatedClient,
160+
) -> Optional[Union[Error, PeerRefreshTokenResponse]]:
161+
"""Refresh peer token
162+
163+
Args:
164+
room_id (str):
165+
id (str):
166+
167+
Raises:
168+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
169+
httpx.TimeoutException: If the request takes longer than Client.timeout.
170+
171+
Returns:
172+
Union[Error, PeerRefreshTokenResponse]
173+
"""
174+
175+
return (
176+
await asyncio_detailed(
177+
room_id=room_id,
178+
id=id,
179+
client=client,
180+
)
181+
).parsed

fishjam/_openapi_client/models/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545
from .peer_details_response_data import PeerDetailsResponseData
4646
from .peer_options_web_rtc import PeerOptionsWebRTC
4747
from .peer_options_web_rtc_metadata import PeerOptionsWebRTCMetadata
48+
from .peer_refresh_token_response import PeerRefreshTokenResponse
49+
from .peer_refresh_token_response_data import PeerRefreshTokenResponseData
4850
from .peer_status import PeerStatus
4951
from .recording_list_response import RecordingListResponse
5052
from .room import Room
@@ -100,6 +102,8 @@
100102
"PeerDetailsResponseData",
101103
"PeerOptionsWebRTC",
102104
"PeerOptionsWebRTCMetadata",
105+
"PeerRefreshTokenResponse",
106+
"PeerRefreshTokenResponseData",
103107
"PeerStatus",
104108
"RecordingListResponse",
105109
"Room",
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar
2+
3+
from attrs import define as _attrs_define
4+
from attrs import field as _attrs_field
5+
6+
if TYPE_CHECKING:
7+
from ..models.peer_refresh_token_response_data import PeerRefreshTokenResponseData
8+
9+
10+
T = TypeVar("T", bound="PeerRefreshTokenResponse")
11+
12+
13+
@_attrs_define
14+
class PeerRefreshTokenResponse:
15+
"""Response containing new peer token"""
16+
17+
data: "PeerRefreshTokenResponseData"
18+
""""""
19+
additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
20+
"""@private"""
21+
22+
def to_dict(self) -> Dict[str, Any]:
23+
"""@private"""
24+
data = self.data.to_dict()
25+
26+
field_dict: Dict[str, Any] = {}
27+
field_dict.update(self.additional_properties)
28+
field_dict.update(
29+
{
30+
"data": data,
31+
}
32+
)
33+
34+
return field_dict
35+
36+
@classmethod
37+
def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
38+
"""@private"""
39+
from ..models.peer_refresh_token_response_data import (
40+
PeerRefreshTokenResponseData,
41+
)
42+
43+
d = src_dict.copy()
44+
data = PeerRefreshTokenResponseData.from_dict(d.pop("data"))
45+
46+
peer_refresh_token_response = cls(
47+
data=data,
48+
)
49+
50+
peer_refresh_token_response.additional_properties = d
51+
return peer_refresh_token_response
52+
53+
@property
54+
def additional_keys(self) -> List[str]:
55+
"""@private"""
56+
return list(self.additional_properties.keys())
57+
58+
def __getitem__(self, key: str) -> Any:
59+
return self.additional_properties[key]
60+
61+
def __setitem__(self, key: str, value: Any) -> None:
62+
self.additional_properties[key] = value
63+
64+
def __delitem__(self, key: str) -> None:
65+
del self.additional_properties[key]
66+
67+
def __contains__(self, key: str) -> bool:
68+
return key in self.additional_properties
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
from typing import Any, Dict, List, Type, TypeVar
2+
3+
from attrs import define as _attrs_define
4+
from attrs import field as _attrs_field
5+
6+
T = TypeVar("T", bound="PeerRefreshTokenResponseData")
7+
8+
9+
@_attrs_define
10+
class PeerRefreshTokenResponseData:
11+
""" """
12+
13+
token: str
14+
"""Token for authorizing websocket connection"""
15+
additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
16+
"""@private"""
17+
18+
def to_dict(self) -> Dict[str, Any]:
19+
"""@private"""
20+
token = self.token
21+
22+
field_dict: Dict[str, Any] = {}
23+
field_dict.update(self.additional_properties)
24+
field_dict.update(
25+
{
26+
"token": token,
27+
}
28+
)
29+
30+
return field_dict
31+
32+
@classmethod
33+
def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
34+
"""@private"""
35+
d = src_dict.copy()
36+
token = d.pop("token")
37+
38+
peer_refresh_token_response_data = cls(
39+
token=token,
40+
)
41+
42+
peer_refresh_token_response_data.additional_properties = d
43+
return peer_refresh_token_response_data
44+
45+
@property
46+
def additional_keys(self) -> List[str]:
47+
"""@private"""
48+
return list(self.additional_properties.keys())
49+
50+
def __getitem__(self, key: str) -> Any:
51+
return self.additional_properties[key]
52+
53+
def __setitem__(self, key: str, value: Any) -> None:
54+
self.additional_properties[key] = value
55+
56+
def __delitem__(self, key: str) -> None:
57+
del self.additional_properties[key]
58+
59+
def __contains__(self, key: str) -> bool:
60+
return key in self.additional_properties

fishjam/api/_fishjam_client.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@
1111
from fishjam._openapi_client.api.room import delete_room as room_delete_room
1212
from fishjam._openapi_client.api.room import get_all_rooms as room_get_all_rooms
1313
from fishjam._openapi_client.api.room import get_room as room_get_room
14+
from fishjam._openapi_client.api.room import refresh_token as room_refresh_token
1415
from fishjam._openapi_client.models import (
1516
AddPeerJsonBody,
1617
Peer,
1718
PeerDetailsResponse,
1819
PeerOptionsWebRTC,
20+
PeerRefreshTokenResponse,
1921
RoomConfig,
2022
RoomCreateDetailsResponse,
2123
RoomDetailsResponse,
@@ -167,6 +169,16 @@ def delete_room(self, room_id: str) -> None:
167169

168170
return self._request(room_delete_room, room_id=room_id)
169171

172+
def refresh_peer_token(self, room_id: str, peer_id: str) -> str:
173+
"""Refreshes peer token"""
174+
175+
response = cast(
176+
PeerRefreshTokenResponse,
177+
self._request(room_refresh_token, id=peer_id, room_id=room_id),
178+
)
179+
180+
return response.data.token
181+
170182
def __parse_peer_metadata(self, metadata: dict | None) -> PeerOptionsWebRTCMetadata:
171183
peer_metadata = PeerOptionsWebRTCMetadata()
172184

tests/test_room_api.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ def test_invalid(self, room_api: FishjamClient):
178178
room_api.get_room("invalid_id")
179179

180180

181-
class TestCreateParticipant:
181+
class TestCreatePeer:
182182
def _assert_peer_created(
183183
self, room_api, webrtc_peer, room_id, server_metadata=None
184184
):
@@ -227,7 +227,7 @@ def test_peer_limit_reached(self, room_api: FishjamClient):
227227
room_api.create_peer(room.id)
228228

229229

230-
class TestDeleteParticipant:
230+
class TestDeletePeer:
231231
def test_valid(self, room_api: FishjamClient):
232232
room = room_api.create_room()
233233
peer, _token = room_api.create_peer(room.id)
@@ -240,3 +240,18 @@ def test_invalid(self, room_api: FishjamClient):
240240

241241
with pytest.raises(NotFoundError):
242242
room_api.delete_peer(room.id, peer_id="invalid_peer_id")
243+
244+
245+
class TestRefreshPeerToken:
246+
def test_valid(self, room_api: FishjamClient):
247+
room = room_api.create_room()
248+
peer, token = room_api.create_peer(room.id)
249+
refreshed_token = room_api.refresh_peer_token(room.id, peer.id)
250+
251+
assert token != refreshed_token
252+
253+
def test_invalid(self, room_api: FishjamClient):
254+
room = room_api.create_room()
255+
256+
with pytest.raises(NotFoundError):
257+
room_api.refresh_peer_token(room.id, peer_id="invalid_peer_id")

0 commit comments

Comments
 (0)