Bedrud Документация

Эндпоинты управления комнатами находятся под /api/room/. Все эндпоинты требуют аутентификации.

Обзор

ЭндпоинтМетодОписание
/api/room/createPOSTСоздать новую комнату
/api/room/joinPOSTПрисоединиться к комнате и получить LiveKit-токен
/api/room/listGETСписок доступных комнат
/api/room/:roomId/kick/:identityPOSTИсключить участника (админ)
/api/room/:roomId/mute/:identityPOSTЗаглушить участника (админ)
/api/room/:roomId/video/:identity/offPOSTОтключить видео участника (админ)

Эндпоинты

Создание комнаты

Создание новой комнаты для встреч. Авторизованный пользователь становится администратором комнаты.

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"
}

Поля

ПолеТипОбязательноОписание
namestringНетURL-безопасное имя комнаты (автогенерируется, если опущено)
isPublicbooleanНетОтображается ли комната в публичных списках
modestringНетРежим комнаты (например, "standard")
maxParticipantsnumberНетМаксимальное количество участников
settings.allowChatbooleanНетВключён ли текстовый чат
settings.allowVideobooleanНетВключено ли видео
settings.allowAudiobooleanНетВключено ли аудио
settings.requireApprovalbooleanНетТребуется ли подтверждение администратора для участников
settings.e2eebooleanНетВключено ли сквозное шифрование

Присоединение к комнате

Присоединение к существующей комнате и получение 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Внутренняя ошибка сервера

См. также