mirror of
https://github.com/suitenumerique/meet.git
synced 2026-08-30 12:09:08 +00:00
♻️(backend) refactor backend recording state management
Instead of relying on the egress_started event—which fires when egress is starting, not actually started—I now rely on egress_updated for more accurate status updates. This is especially important for the active status, which triggers after egress has truly joined the room. Using this avoids prematurely stopping client-side listening to room.isRecording updates. A further refactoring may remove reliance on room updates entirely. The goal is to minimize handling metadata in the mediator class. egress_starting is still used for simplicity, but egress_started could be considered in the future. Note: if the API to start egress hasn’t responded yet, the webhook may fail to find the recording because it currently matches by worker ID. This is unstable. A better approach would be to pass the database ID in the egress metadata and recover the recording from it in the webhook.
This commit is contained in:
committed by
aleb_the_flash
parent
2863aa832d
commit
f6cdb1125b
@@ -1,7 +1,11 @@
|
||||
"""Recording-related LiveKit Events Service"""
|
||||
|
||||
# pylint: disable=no-member
|
||||
|
||||
from logging import getLogger
|
||||
|
||||
from livekit import api
|
||||
|
||||
from core import models, utils
|
||||
|
||||
logger = getLogger(__name__)
|
||||
@@ -14,6 +18,27 @@ class RecordingEventsError(Exception):
|
||||
class RecordingEventsService:
|
||||
"""Handles recording-related Livekit webhook events."""
|
||||
|
||||
@staticmethod
|
||||
def handle_update(recording, egress_status):
|
||||
"""Handle egress status updates and sync recording state to room metadata."""
|
||||
|
||||
room_name = str(recording.room.id)
|
||||
|
||||
status_mapping = {
|
||||
api.EgressStatus.EGRESS_ACTIVE: "started",
|
||||
api.EgressStatus.EGRESS_ENDING: "saving",
|
||||
api.EgressStatus.EGRESS_ABORTED: "aborted",
|
||||
}
|
||||
|
||||
recording_status = status_mapping.get(egress_status)
|
||||
if recording_status:
|
||||
try:
|
||||
utils.update_room_metadata(
|
||||
room_name, {"recording_status": recording_status}
|
||||
)
|
||||
except utils.MetadataUpdateException as e:
|
||||
logger.exception("Failed to update room's metadata: %s", e)
|
||||
|
||||
@staticmethod
|
||||
def handle_limit_reached(recording):
|
||||
"""Stop recording and notify participants when limit is reached."""
|
||||
|
||||
Reference in New Issue
Block a user