Bedrud التوثيق

يغطي هذا المستند القرارات التقنية الداخلية وراء بنية الملف الثنائي الواحد في 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 يضمن أنه حتى لو سُرق رمز التحديث، لا يمكن استخدامه بعد أن يكون المستخدم قد سجّل الخروج بشكل نظيف أو حدّث جلسته.