44 lines
1.8 KiB
Python
44 lines
1.8 KiB
Python
"""Выдача LiveKit access-токенов участникам конференции."""
|
||
|
||
from datetime import timedelta
|
||
|
||
from livekit import api
|
||
|
||
from core.config import get_settings
|
||
|
||
TOKEN_TTL = timedelta(hours=6)
|
||
|
||
|
||
def create_room_access_token(
|
||
*, room_name: str, identity: str, name: str, metadata: str | None = None
|
||
) -> str:
|
||
"""Создать JWT access-токен LiveKit для входа участника в комнату.
|
||
|
||
`identity` — произвольная строка identity, используемая webhook-
|
||
обработчиками (`services.webhook_handlers`) для сопоставления треков с
|
||
участником: `str(user_id)` для зарегистрированного пользователя,
|
||
`guest:{guest_access.id}` для гостя (ADR-001, п.6). `name` — отображаемое
|
||
имя, показывается клиентским UI. `metadata` — произвольная строка
|
||
(JSON), доступная клиенту как `participant.metadata` — используется
|
||
для аватара при выключенной камере; `None` (гость либо пользователь
|
||
без аватара) — метаданные не выставляются вовсе.
|
||
"""
|
||
settings = get_settings()
|
||
token = (
|
||
api.AccessToken(settings.livekit_api_key, settings.livekit_api_secret)
|
||
.with_identity(identity)
|
||
.with_name(name)
|
||
.with_grants(
|
||
api.VideoGrants(
|
||
room_join=True,
|
||
room=room_name,
|
||
can_publish=True,
|
||
can_subscribe=True,
|
||
)
|
||
)
|
||
.with_ttl(TOKEN_TTL)
|
||
)
|
||
if metadata is not None:
|
||
token = token.with_metadata(metadata)
|
||
return token.to_jwt()
|