يغطي هذا المستند القرارات التقنية الداخلية وراء بنية الملف الثنائي الواحد في Bedrud.
١. الجسر من Fiber إلى المعيار
يستخدم Bedrud Fiber لسرعته، لكن بعض التبعيات مثل Goth (OAuth) و LiveKit SDK (Twirp) تتوقع http.ResponseWriter و http.Request القياسيين في Go.
للجسر بين العالمين، يُنفّذ Bedrud نمط المحوّل في 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 القياسية الواسعة.
٢. البروكسي العكسي لـ LiveKit
يتجنب Bedrud مشاكل إدارة المنافذ بتوجيه جميع إشارات الوسائط عبر منفذه الرئيسي.
كيف يعمل:
١. الاكتشاف: إذا كان LIVEKIT_INTERNAL_HOST يشير إلى 127.0.0.1، يبدأ Bedrud محرك الوسائط الداخلي.
٢. التركيب: يركّب httputil.NewSingleHostReverseProxy على مسار /livekit.
٣. تجريد المسار: يُستخدم دالة Director مخصصة لتجريد بادئة /livekit بحيث يتلقى خادم الوسائط الطلب وكأنه في الجذر.
٤. دعم WebSocket: بما أن البروكسي يعمل على تدفق TCP الأساسي عبر adaptor.HTTPHandler، فهو يدعم بشكل أصلي WebSockets التي يستخدمها LiveKit للإشارات في الوقت الفعلي.
٣. كفاءة التخزين: البنى المدمجة
يستخدم 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 وأكثر قابلية للبحث من كتلة JSON.
٤. بنية الاختبار
يتبع Bedrud استراتيجية اختبار “قاعدة البيانات أولاً” باستخدام حزمة internal/testutil.
منطق SetupTestDB:
- ينشئ قاعدة بيانات SQLite في الذاكرة فريدة لكل اختبار.
- يشغّل جميع التهييرات تلقائيًا.
- يوفر صفحة نظيفة، مما يضمن أن الاختبارات حتمية ويمكن تشغيلها بالتوازي.
لتشغيل اختبارات الخلفية:
go test ./internal/...٥. الأمان: تدوير الرموز وإبطالها
على عكس تطبيقات JWT البسيطة، يُدوّر Bedrud كلا الرمزين في كل تحديث.
- اكتشاف إعادة استخدام رمز التحديث: بمجرد استخدام رمز التحديث للحصول على زوج جديد، يُحظر.
- التنظيف: جدول
BlockedRefreshTokenيضمن أنه حتى لو سُرق رمز التحديث، لا يمكن استخدامه بعد أن يكون المستخدم قد سجّل الخروج بشكل نظيف أو حدّث جلسته.