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 Context کپی می‌کند.

هدف

این به Bedrud اجازه می‌دهد در حالی که سازگاری کامل با اکوسیستم وسیع کتابخانه‌های وب استاندارد Go را حفظ می‌کند، به شدت سریع باقی بماند (با استفاده از Fiber).

۲. reverse proxy LiveKit

Bedrud با مسیریابی تمام سیگنالینگ رسانه از طریق پورت اصلی، از مشکلات مدیریت پورت جلوگیری می‌کند.

نحوه کار:

۱. تشخیص: اگر LIVEKIT_INTERNAL_HOST به 127.0.0.1 اشاره کند، Bedrud موتور رسانه داخلی را شروع می‌کند. ۲. نصب: یک httputil.NewSingleHostReverseProxy در مسیر /livekit نصب می‌کند. ۳. حذف مسیر: یک تابع سفارشی Director برای حذف پیشوند /livekit استفاده می‌شود تا media server درخواست را دریافت کند گویی که در روت است. ۴. پشتیبانی WebSocket: از آنجا که پروکسی از طریق adaptor.HTTPHandler روی جریان TCP زیرین عمل می‌کند، به طور بومی از WebSocketهایی که 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 و قابل جستجوی بیشتر از یک blob JSON است.

۴. زیرساخت تست

Bedrud یک استراتژی تست “DB-First” با استفاده از بسته internal/testutil دنبال می‌کند.

منطق SetupTestDB:

  • برای هر تست یک دیتابیس SQLite در حافظه منحصر به فرد ایجاد می‌کند.
  • به طور خودکار تمام مهاجرت‌ها را اجرا می‌کند.
  • یک صفحه تمیز ارائه می‌دهد، که اطمینان حاصل می‌کند تست‌ها قطعی هستند و می‌توانند به صورت موازی اجرا شوند.

برای اجرای تست‌های بک‌اند:

go test ./internal/...

۵. امنیت: چرخش و لغو توکن

برخلاف پیاده‌سازی‌های ساده JWT، Bedrud هر دو توکن را در هر تازه‌سازی می‌چرخاند.

  • تشخیص استفاده مجدد توکن تازه‌سازی: هنگامی که توکن تازه‌سازی برای دریافت جفت جدید استفاده می‌شود، مسدود می‌شود.
  • پاکسازی: جدول BlockedRefreshToken اطمینان حاصل می‌کند که حتی اگر توکن تازه‌سازی دزدیده شود، پس از خروج تمیز کاربر یا تازه‌سازی جلسه نمی‌تواند استفاده شود.