Ce document couvre les décisions techniques internes derrière l’architecture binaire unique de Bedrud.
1. Le Pont Fiber-vers-Standard
Bedrud utilise Fiber pour sa rapidité, mais certaines dépendances comme Goth (OAuth) et LiveKit SDK (Twirp) s’attendent aux http.ResponseWriter et http.Request standard de Go.
Pour relier ces deux mondes, Bedrud implémente un Pattern Adaptateur dans internal/handlers/auth.go :
Adaptateur responseWriter
type responseWriter struct {
ctx *fiber.Ctx
headers http.Header
status int
}Cette structure implémente l’interface http.ResponseWriter. Lorsqu’une fonction de la bibliothèque standard (comme Goth) appelle Header().Add(), l’adaptateur le stocke dans une map locale headers. Lorsque WriteHeader() est appelé, il copie manuellement tous les en-têtes dans le Contexte Fiber.
Objectif
Il permet à Bedrud de rester extrêmement rapide (en utilisant Fiber) tout en maintenant une compatibilité complète avec le vaste écosystème de bibliothèques web Go standard.
2. Proxy Inverse LiveKit
Bedrud évite les problèmes de gestion de port en acheminant tout le signal média via son port principal.
Comment cela fonctionne :
- Détection : Si
LIVEKIT_INTERNAL_HOSTpointe vers127.0.0.1, Bedrud démarre le moteur média interne. - Montage : Il monte un
httputil.NewSingleHostReverseProxysur la route/livekit. - Suppression de Chemin : Une fonction Director personnalisée est utilisée pour supprimer le préfixe
/livekitafin que le serveur média reçoive la requête comme si elle était à la racine. - Support WebSocket : Puisque le proxy opère sur le flux TCP sous-jacent via
adaptor.HTTPHandler, il supporte nativement les WebSockets utilisés par LiveKit pour la signalisation en temps réel.
3. Efficacité de Stockage : Structs Intégrés
Bedrud utilise largement le tag embedded de GORM pour garder le schéma de base de données plat et optimisé.
Exemple de models/room.go :
type Room struct {
ID string `gorm:"primaryKey"`
Settings RoomSettings `gorm:"embedded;embeddedPrefix:settings_"`
}Cela fait en sorte que GORM crée des colonnes comme settings_allow_chat directement dans la table rooms. C’est plus rapide qu’un JOIN et plus recherchable qu’un blob JSON.
4. Infrastructure de Tests
Bedrud suit une stratégie de test “DB-First” en utilisant le package internal/testutil.
Logique SetupTestDB :
- Crée une base de données SQLite en mémoire unique pour chaque test.
- Exécute automatiquement toutes les migrations.
- Fournit une table rase, assurant que les tests sont déterministes et peuvent s’exécuter en parallèle.
Pour exécuter les tests backend :
go test ./internal/...5. Sécurité : Rotation et Révocation de Jetons
Contrairement aux implémentations JWT simples, Bedrud fait tourner les deux jetons à chaque rafraîchissement.
- Détection de Réutilisation de Jeton de Rafraîchissement : Une fois qu’un jeton de rafraîchissement est utilisé pour obtenir une nouvelle paire, il est bloqué.
- Nettoyage : La table
BlockedRefreshTokengarantit que même si un jeton de rafraîchissement est volé, il ne peut pas être utilisé après que l’utilisateur s’est déconnecté proprement ou a rafraîchi sa session.