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

Этот документ описывает внутренние технические решения, лежащие в основе архитектуры единого бинарного файла Bedrud.

1. Мост Fiber-to-Standard

Bedrud использует Fiber для скорости, но некоторые зависимости, такие как Goth (OAuth) и LiveKit SDK (Twirp), ожидают стандартные Go http.ResponseWriter и http.Request.

Для соединения этих двух миров Bedrud реализует паттерн Adapter в internal/handlers/auth.go:

Адаптер responseWriter

type responseWriter struct {
    ctx     *fiber.Ctx
    headers http.Header
    status  int
}

Эта структура реализует интерфейс http.ResponseWriter. Когда функция стандартной библиотеки (например, Goth) вызывает Header().Add(), адаптер сохраняет это в локальной карте headers. Когда вызывается WriteHeader(), он вручную копирует все заголовки обратно в контекст Fiber.

Назначение

Это позволяет Bedrud оставаться крайне быстрым (используя Fiber), сохраняя полную совместимость с обширной экосистемой стандартных веб-библиотек Go.

2. Обратное проксирование LiveKit

Bedrud избегает проблем с управлением портами, направляя всю медиасигнализацию через свой основной порт.

Как это работает:

  1. Обнаружение: Если LIVEKIT_INTERNAL_HOST указывает на 127.0.0.1, Bedrud запускает внутренний медиадвижок.
  2. Монтирование: Монтирует httputil.NewSingleHostReverseProxy на маршрут /livekit.
  3. Удаление пути: Используется пользовательская функция Director для удаления префикса /livekit, чтобы медиасервер получал запрос так, как будто он находится в корне.
  4. Поддержка WebSocket: Поскольку прокси работает на базовом TCP-потоке через adaptor.HTTPHandler, он изначально поддерживает WebSocket, используемые LiveKit для сигнализации в реальном времени.

3. Эффективность хранения: встроенные структуры

Bedrud активно использует тег embedded от GORM для поддержания плоской и оптимизированной схемы базы данных.

Пример из models/room.go:

type Room struct {
    ID       string       `gorm:"primaryKey"`
    Settings RoomSettings `gorm:"embedded;embeddedPrefix:settings_"`
}

Это заставляет GORM создавать столбцы вроде settings_allow_chat непосредственно в таблице rooms. Это быстрее, чем JOIN, и более удобно для поиска, чем blob JSON.

4. Тестовая инфраструктура

Bedrud следует стратегии тестирования «DB-First» с использованием пакета internal/testutil.

Логика SetupTestDB:

  • Создаёт уникальную базу данных SQLite in-memory для каждого теста.
  • Автоматически запускает все миграции.
  • Предоставляет чистый лист, обеспечивая детерминированность тестов и возможность их параллельного выполнения.

Для запуска тестов бэкенда:

go test ./internal/...

5. Безопасность: ротация и отзыв токенов

В отличие от простых реализаций JWT, Bedrud ротирует оба токена при каждом обновлении.

  • Обнаружение повторного использования Refresh Token: Как только refresh token используется для получения новой пары, он блокируется.
  • Очистка: Таблица BlockedRefreshToken гарантирует, что даже если refresh token был украден, его нельзя использовать после того, как пользователь корректно вышел из системы или обновил свою сессию.