mirror of
https://github.com/Monadical-SAS/reflector.git
synced 2025-12-21 12:49:06 +00:00
* Switch platform ui * Update room settings based on platform * Add local and none recording options to daily * Don't create tokens for unauthentikated users * Enable knocking for private rooms * Create new meeting on room settings change * Always use 2-200 option for daily * Show recording start trigger for daily * Fix broken test
163 lines
5.2 KiB
Python
163 lines
5.2 KiB
Python
"""
|
|
Daily.co API Request Models
|
|
|
|
Reference: https://docs.daily.co/reference/rest-api
|
|
"""
|
|
|
|
from typing import List, Literal
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
from reflector.utils.string import NonEmptyString
|
|
|
|
|
|
class RecordingsBucketConfig(BaseModel):
|
|
"""
|
|
S3 bucket configuration for raw-tracks recordings.
|
|
|
|
Reference: https://docs.daily.co/reference/rest-api/rooms/create-room
|
|
"""
|
|
|
|
bucket_name: NonEmptyString = Field(description="S3 bucket name")
|
|
bucket_region: NonEmptyString = Field(description="AWS region (e.g., 'us-east-1')")
|
|
assume_role_arn: NonEmptyString = Field(
|
|
description="AWS IAM role ARN that Daily.co will assume to write recordings"
|
|
)
|
|
allow_api_access: bool = Field(
|
|
default=True,
|
|
description="Whether to allow API access to recording metadata",
|
|
)
|
|
|
|
|
|
class RoomProperties(BaseModel):
|
|
"""
|
|
Room configuration properties.
|
|
"""
|
|
|
|
enable_recording: Literal["cloud", "local", "raw-tracks"] | None = Field(
|
|
default=None,
|
|
description="Recording mode: 'cloud' for mixed, 'local' for local recording, 'raw-tracks' for multitrack, None to disable",
|
|
)
|
|
enable_chat: bool = Field(default=True, description="Enable in-meeting chat")
|
|
enable_screenshare: bool = Field(default=True, description="Enable screen sharing")
|
|
enable_knocking: bool = Field(
|
|
default=False,
|
|
description="Enable knocking for private rooms (allows participants to request access)",
|
|
)
|
|
start_video_off: bool = Field(
|
|
default=False, description="Start with video off for all participants"
|
|
)
|
|
start_audio_off: bool = Field(
|
|
default=False, description="Start with audio muted for all participants"
|
|
)
|
|
exp: int | None = Field(
|
|
None, description="Room expiration timestamp (Unix epoch seconds)"
|
|
)
|
|
recordings_bucket: RecordingsBucketConfig | None = Field(
|
|
None, description="S3 bucket configuration for raw-tracks recordings"
|
|
)
|
|
|
|
|
|
class CreateRoomRequest(BaseModel):
|
|
"""
|
|
Request to create a new Daily.co room.
|
|
|
|
Reference: https://docs.daily.co/reference/rest-api/rooms/create-room
|
|
"""
|
|
|
|
name: NonEmptyString = Field(description="Room name (must be unique within domain)")
|
|
privacy: Literal["public", "private"] = Field(
|
|
default="public", description="Room privacy setting"
|
|
)
|
|
properties: RoomProperties = Field(
|
|
default_factory=RoomProperties, description="Room configuration properties"
|
|
)
|
|
|
|
|
|
class MeetingTokenProperties(BaseModel):
|
|
"""
|
|
Properties for meeting token creation.
|
|
|
|
Reference: https://docs.daily.co/reference/rest-api/meeting-tokens/create-meeting-token
|
|
"""
|
|
|
|
room_name: NonEmptyString = Field(description="Room name this token is valid for")
|
|
user_id: NonEmptyString | None = Field(
|
|
None, description="User identifier to associate with token"
|
|
)
|
|
is_owner: bool = Field(
|
|
default=False, description="Grant owner privileges to token holder"
|
|
)
|
|
start_cloud_recording: bool = Field(
|
|
default=False, description="Automatically start cloud recording on join"
|
|
)
|
|
enable_recording_ui: bool = Field(
|
|
default=True, description="Show recording controls in UI"
|
|
)
|
|
eject_at_token_exp: bool = Field(
|
|
default=False, description="Eject participant when token expires"
|
|
)
|
|
nbf: int | None = Field(
|
|
None, description="Not-before timestamp (Unix epoch seconds)"
|
|
)
|
|
exp: int | None = Field(
|
|
None, description="Expiration timestamp (Unix epoch seconds)"
|
|
)
|
|
|
|
|
|
class CreateMeetingTokenRequest(BaseModel):
|
|
"""
|
|
Request to create a meeting token for participant authentication.
|
|
|
|
Reference: https://docs.daily.co/reference/rest-api/meeting-tokens/create-meeting-token
|
|
"""
|
|
|
|
properties: MeetingTokenProperties = Field(description="Token properties")
|
|
|
|
|
|
class CreateWebhookRequest(BaseModel):
|
|
"""
|
|
Request to create a webhook subscription.
|
|
|
|
Reference: https://docs.daily.co/reference/rest-api/webhooks
|
|
"""
|
|
|
|
url: NonEmptyString = Field(description="Webhook endpoint URL (must be HTTPS)")
|
|
eventTypes: List[
|
|
Literal[
|
|
"participant.joined",
|
|
"participant.left",
|
|
"recording.started",
|
|
"recording.ready-to-download",
|
|
"recording.error",
|
|
]
|
|
] = Field(
|
|
description="Array of event types to subscribe to (only events we handle)"
|
|
)
|
|
hmac: NonEmptyString = Field(
|
|
description="Base64-encoded HMAC secret for webhook signature verification"
|
|
)
|
|
basicAuth: NonEmptyString | None = Field(
|
|
None, description="Optional basic auth credentials for webhook endpoint"
|
|
)
|
|
|
|
|
|
class UpdateWebhookRequest(BaseModel):
|
|
"""
|
|
Request to update an existing webhook.
|
|
|
|
Note: Daily.co API may not support PATCH for webhooks.
|
|
Common pattern is to delete and recreate.
|
|
|
|
Reference: https://docs.daily.co/reference/rest-api/webhooks
|
|
"""
|
|
|
|
url: NonEmptyString | None = Field(None, description="New webhook endpoint URL")
|
|
eventTypes: List[NonEmptyString] | None = Field(
|
|
None, description="New array of event types"
|
|
)
|
|
hmac: NonEmptyString | None = Field(None, description="New HMAC secret")
|
|
basicAuth: NonEmptyString | None = Field(
|
|
None, description="New basic auth credentials"
|
|
)
|