mirror of
https://github.com/suitenumerique/meet.git
synced 2026-08-19 14:56:48 +00:00
✨(backend) add synchronization mechanism for room configuration updates
Introduce synchronization of room configuration changes across active participants. When a room configuration is updated through a PUT operation, the backend now performs an additional LiveKit API call to notify room participants through a room metadata update event. This ensures admins and owners quickly see up-to-date settings in their administration panel. It also prepares the frontend for automatic updates of unprivileged participants room’s data without refetching it from the API. An event-driven design was chosen instead of storing the full room configuration in LiveKit metadata. While embedding the state directly in metadata would provide immediate synchronization, it would also require initializing and maintaining configuration state during room creation or webhook handling, increasing the risk of operational failures and regressions. Instead, the backend emits lightweight synchronization events and active clients update their React Query cache, which remains the single source of truth for room configuration data.
This commit is contained in:
committed by
aleb_the_flash
parent
c20daafd81
commit
5a7a0da923
@@ -77,6 +77,11 @@ from core.services.participants_management import (
|
||||
ParticipantsManagementException,
|
||||
)
|
||||
from core.services.room_creation import RoomCreation
|
||||
from core.services.room_management import (
|
||||
RoomManagement,
|
||||
RoomManagementException,
|
||||
RoomNotFoundException,
|
||||
)
|
||||
from core.services.subtitle import SubtitleException, SubtitleService
|
||||
from core.tasks.file import process_file_deletion
|
||||
|
||||
@@ -300,6 +305,33 @@ class RoomViewSet(
|
||||
if callback_id := self.request.data.get("callback_id"):
|
||||
RoomCreation().persist_callback_state(callback_id, room)
|
||||
|
||||
def perform_update(self, serializer):
|
||||
"""Persist the room update, then sync metadata to LiveKit."""
|
||||
|
||||
old_configuration = serializer.instance.configuration
|
||||
room = serializer.save()
|
||||
|
||||
if room.configuration == old_configuration:
|
||||
return
|
||||
|
||||
metadata = {"configuration": room.configuration}
|
||||
|
||||
try:
|
||||
RoomManagement().update_metadata(
|
||||
room_name=str(room.id),
|
||||
metadata=metadata,
|
||||
)
|
||||
except RoomNotFoundException:
|
||||
logger.info(
|
||||
"LiveKit room %s does not exist yet, skipping metadata sync",
|
||||
room.id,
|
||||
)
|
||||
except RoomManagementException:
|
||||
logger.warning(
|
||||
"Failed to sync metadata to LiveKit for room %s",
|
||||
room.id,
|
||||
)
|
||||
|
||||
@decorators.action(
|
||||
detail=True,
|
||||
methods=["post"],
|
||||
|
||||
Reference in New Issue
Block a user