Этот документ описывает внутренние технические решения, лежащие в основе архитектуры единого бинарного файла 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 избегает проблем с управлением портами, направляя всю медиасигнализацию через свой основной порт.
Как это работает:
- Обнаружение: Если
LIVEKIT_INTERNAL_HOSTуказывает на127.0.0.1, Bedrud запускает внутренний медиадвижок. - Монтирование: Монтирует
httputil.NewSingleHostReverseProxyна маршрут/livekit. - Удаление пути: Используется пользовательская функция Director для удаления префикса
/livekit, чтобы медиасервер получал запрос так, как будто он находится в корне. - Поддержка 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 был украден, его нельзя использовать после того, как пользователь корректно вышел из системы или обновил свою сессию.