Эндпоинты управления комнатами находятся под /api/room/. Все эндпоинты требуют аутентификации.
Обзор
| Эндпоинт | Метод | Описание |
|---|---|---|
/api/room/create | POST | Создать новую комнату |
/api/room/join | POST | Присоединиться к комнате и получить LiveKit-токен |
/api/room/list | GET | Список доступных комнат |
/api/room/:roomId/kick/:identity | POST | Исключить участника (админ) |
/api/room/:roomId/mute/:identity | POST | Заглушить участника (админ) |
/api/room/:roomId/video/:identity/off | POST | Отключить видео участника (админ) |
Эндпоинты
Создание комнаты
Создание новой комнаты для встреч. Авторизованный пользователь становится администратором комнаты.
POST /api/room/create
Заголовки: Authorization: Bearer <accessToken>
Тело запроса:
{
"name": "team-standup",
"isPublic": true,
"mode": "standard",
"settings": {
"allowChat": true,
"allowVideo": true,
"allowAudio": true,
"requireApproval": false,
"e2ee": false
}
}Примечание: Поле
nameнеобязательно. Если оно опущено или пустое, сервер автоматически сгенерирует случайное URL-безопасное имя в форматеxxx-xxxx-xxx(например,bkf-qmzl-rja).
Правила имени комнаты:
Имена комнат отображаются в URL как https://bedrud.xyz/m/NAME, поэтому они должны быть URL-безопасными:
| Правило | Описание |
|---|---|
| Допустимые символы | Строчные буквы (a-z), цифры (0-9) и дефисы (-) |
| Минимальная длина | 3 символа |
| Максимальная длина | 63 символа |
| Без спецсимволов | #, @, _, ., /, \, <, >, &, %, +, =, ;, :, ', ", ?, !, пробелы и т.д. недопустимы |
| Без дефисов в начале/конце | -room и room- недопустимы |
| Без двойных дефисов | room--name недопустимо |
| Только строчные | Заглавные буквы отклоняются; ввод автоматически приводится к нижнему регистру |
| Уникальность | Каждое имя комнаты должно быть уникальным |
Ответ (200):
{
"id": "uuid",
"name": "team-standup",
"createdBy": "user-uuid",
"isActive": true,
"isPublic": true,
"maxParticipants": 0,
"settings": {
"allowChat": true,
"allowVideo": true,
"allowAudio": true,
"requireApproval": false,
"e2ee": false
},
"livekitHost": "wss://lk.bedrud.xyz",
"mode": "standard"
}Поля
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
name | string | Нет | URL-безопасное имя комнаты (автогенерируется, если опущено) |
isPublic | boolean | Нет | Отображается ли комната в публичных списках |
mode | string | Нет | Режим комнаты (например, "standard") |
maxParticipants | number | Нет | Максимальное количество участников |
settings.allowChat | boolean | Нет | Включён ли текстовый чат |
settings.allowVideo | boolean | Нет | Включено ли видео |
settings.allowAudio | boolean | Нет | Включено ли аудио |
settings.requireApproval | boolean | Нет | Требуется ли подтверждение администратора для участников |
settings.e2ee | boolean | Нет | Включено ли сквозное шифрование |
Присоединение к комнате
Присоединение к существующей комнате и получение LiveKit-токена для медиаподключения.
POST /api/room/join
Заголовки: Authorization: Bearer <accessToken>
Тело запроса:
{
"roomName": "team-standup"
}Ответ (200):
{
"id": "uuid",
"name": "team-standup",
"token": "eyJ...",
"createdBy": "user-uuid",
"adminId": "user-uuid",
"isActive": true,
"isPublic": true,
"maxParticipants": 20,
"expiresAt": "2026-02-16T12:00:00Z",
"settings": { ... },
"livekitHost": "wss://lk.bedrud.xyz",
"mode": "standard"
}Поле token - это подписанный access-токен LiveKit. Используйте его для подключения к серверу LiveKit через WebSocket:
import { Room } from 'livekit-client';
const room = new Room();
await room.connect(livekitUrl, token);Список комнат
Получение списка комнат, созданных пользователем.
GET /api/room/list
Заголовки: Authorization: Bearer <accessToken>
Ответ (200):
[
{
"id": "uuid",
"name": "team-standup",
"createdBy": "user-uuid",
"isActive": true,
"maxParticipants": 20,
"expiresAt": "2026-02-16T12:00:00Z",
"settings": { ... },
"mode": "standard",
"relationship": "creator"
}
]Исключение участника
Удаление участника из комнаты. Доступно только администратору комнаты.
POST /api/room/:roomId/kick/:identity
Заголовки: Authorization: Bearer <accessToken>
Ответ (200):
{
"status": "success"
}Заглушить участника
Отключение микрофона участника. Доступно только администратору комнаты.
POST /api/room/:roomId/mute/:identity
Заголовки: Authorization: Bearer <accessToken>
Ответ (200):
{
"status": "success"
}Отключение видео участника
Отключение камеры участника. Доступно только администратору комнаты.
POST /api/room/:roomId/video/:identity/off
Заголовки: Authorization: Bearer <accessToken>
Ответ (200):
{
"status": "success"
}Управление администратора
Действия администратора комнаты (исключение, заглушение, отключение видео) доступны только пользователю, создавшему комнату (adminId). Попытка выполнения этих действий не-администратором возвращает ошибку 403.
Матрица прав
| Действие | Админ комнаты | Супер-админ | Обычный пользователь | Гость |
|---|---|---|---|---|
| Создать комнату | Да | Да | Да | Нет |
| Присоединиться к комнате | Да | Да | Да | Да |
| Список комнат | Да | Да | Да | Да |
| Исключить | Да | Да | Нет | Нет |
| Заглушить | Да | Да | Нет | Нет |
| Отключить видео | Да | Да | Нет | Нет |
Ответы об ошибках
Все ошибки возвращаются в едином формате:
{
"error": "human-readable error message"
}Ошибки создания комнаты
| Статус | Сообщение об ошибке | Описание |
|---|---|---|
| 400 | "Invalid request body" | Некорректный JSON |
| 400 | "room name must contain only lowercase letters, numbers, and hyphens" | Имя содержит спецсимволы (#, @, _ и т.д.) |
| 400 | "room name must be at least 3 characters" | Имя слишком короткое |
| 400 | "room name must be at most 63 characters" | Имя слишком длинное |
| 409 | "a room with this name already exists" | Дублирование имени |
| 500 | "Failed to create media room" | Ошибка сервера LiveKit |
| 500 | "Failed to create room" | Ошибка базы данных |
Общие ошибки
| Статус | Значение |
|---|---|
| 400 | Некорректный запрос (отсутствуют/неверные данные) |
| 401 | Не авторизован |
| 403 | Нет прав (не-администратор пытается выполнить действие администратора) |
| 404 | Комната не найдена |
| 409 | Конфликт (дублирование ресурса) |
| 500 | Внутренняя ошибка сервера |
См. также
- Обзор архитектуры - модель данных и поток подключения к встрече
- Обработчики API - реализация комнатных эндпоинтов