mirror of
https://github.com/suitenumerique/meet.git
synced 2026-08-10 02:39:41 +00:00
f4569c64e5
Updating room access rewrote the entire metadata payload, removing information about active recordings. This caused the frontend to lose track of ongoing recordings and could trigger 409 errors when attempting to start a new recording. Consolidate the duplicated metadata update logic into `RoomManagement.update_metadata()` and preserve merge behavior instead of overwriting the full metadata object.
91 lines
2.6 KiB
Python
91 lines
2.6 KiB
Python
"""Room management service for LiveKit rooms."""
|
|
|
|
# pylint: disable=no-name-in-module
|
|
|
|
import json
|
|
from logging import getLogger
|
|
from typing import Dict, Optional
|
|
|
|
from asgiref.sync import async_to_sync
|
|
from livekit.api import (
|
|
ListRoomsRequest,
|
|
TwirpError,
|
|
UpdateRoomMetadataRequest,
|
|
)
|
|
|
|
from core import utils
|
|
|
|
logger = getLogger(__name__)
|
|
|
|
|
|
class RoomManagementException(Exception):
|
|
"""Exception raised when a room management operation fails."""
|
|
|
|
|
|
class RoomNotFoundException(RoomManagementException):
|
|
"""Raised when the target room does not exist in LiveKit."""
|
|
|
|
|
|
class RoomManagement:
|
|
"""Service for managing LiveKit rooms."""
|
|
|
|
@async_to_sync
|
|
async def update_metadata(
|
|
self,
|
|
room_name: str,
|
|
metadata: Optional[Dict] = None,
|
|
remove_keys: Optional[list[str]] = None,
|
|
):
|
|
"""Merge values into a LiveKit room's metadata.
|
|
|
|
The `room_name` corresponds to the LiveKit room identifier
|
|
(i.e. the Room model's UUID as a string).
|
|
|
|
Raises:
|
|
RoomNotFoundException: the room does not exist in LiveKit.
|
|
RoomManagementException: the metadata update otherwise fails.
|
|
"""
|
|
|
|
lkapi = utils.create_livekit_client()
|
|
|
|
try:
|
|
response = await lkapi.room.list_rooms(ListRoomsRequest(names=[room_name]))
|
|
|
|
if not response.rooms:
|
|
logger.warning(
|
|
"Room %s not found in LiveKit, skipping metadata update",
|
|
room_name,
|
|
)
|
|
raise RoomNotFoundException("Room does not exist")
|
|
|
|
existing_metadata = json.loads(response.rooms[0].metadata or "{}")
|
|
|
|
for key in remove_keys or []:
|
|
existing_metadata.pop(key, None)
|
|
|
|
updated_metadata = {**existing_metadata, **(metadata or {})}
|
|
|
|
await lkapi.room.update_room_metadata(
|
|
UpdateRoomMetadataRequest(
|
|
room=room_name,
|
|
metadata=json.dumps(updated_metadata),
|
|
)
|
|
)
|
|
|
|
except TwirpError as e:
|
|
if e.code == "not_found":
|
|
logger.warning(
|
|
"Room %s not found in LiveKit, skipping metadata update",
|
|
room_name,
|
|
)
|
|
raise RoomNotFoundException("Room does not exist") from e
|
|
|
|
logger.exception(
|
|
"Unexpected error updating metadata for room %s",
|
|
room_name,
|
|
)
|
|
raise RoomManagementException("Could not update room metadata") from e
|
|
|
|
finally:
|
|
await lkapi.aclose()
|