Ana içeriğe geç

Mimariye genel bakış

GuildGate, Discord dashboard sunucusunda güvenlik kararlarını ve yazma işlemlerini ortak bir çekirdekte toplar. Arayüz üretmez, uygulama verisini sahiplenmez ve kullandığın HTTP çatısını zorunlu kılmaz.

Çekirdek​

createGuildGate() yapılandırmayı başlangıçta doğrular ve şu yüzeyleri oluşturur:

  • gate.action() ile korunan işlem tanımı
  • gate.execute() ile istek yürütme
  • gate.sessions ile oturum yönetimi
  • gate.cache ile etiket tabanlı önbellek
  • gate.owner ile bakım ve erişim engeli politikaları
  • gate.revokeSession() ve gate.revokeUserSessions() ile oturum iptali

Çekirdek; origin, oturum, CSRF, politika, rate limit, idempotency, kilit, transaction, audit ve realtime kararlarını aynı istek kimliği altında yürütür.

Action katmanı​

Bir action şu parçaları tek tanımda birleştirir:

  1. Girdiyi ayrıştırma
  2. Kaynağı belirleme
  3. Kimlik ve CSRF denetimi
  4. Yetkilendirme
  5. Rate limit ve idempotency
  6. Optimistic revision ve dağıtık kilit
  7. Transaction içinde domain yazımı
  8. Commit sonrasında cache, realtime ve audit sonuçları

1.1.0 sürümünde yanıt süresi dolduğunda action, alttaki işlem AbortSignal değerini dinlemese bile yapılandırılan sınırda döner. Geç tamamlanan idempotent işlem için reservation ve lease sahipliği sınırlı bir süre korunur.

Store katmanı​

GuildGateStores on küçük sözleşmeden oluşur:

ÜyeSorumluluk
sessionsOturum yaşam döngüsü ve kullanıcı başına sınır
oauthStatesTek kullanımlık OAuth state tüketimi
credentialsŞifreli OAuth kimlik bilgileri
rateLimitsAtomik sayaç ve pencere hesabı
cacheTTL, stale süre ve tag temizliği
idempotencyReservation sahipliği ve replay sonucu
locksLease, yenileme ve fencing token
auditDeğişmez olay kaydı ve cursor sayfalama
outboxClaim lease ile olay teslim kuyruğu
policiesBakım, blok ve politika sürümü

composeStores() farklı backend paketlerini bir araya getirir. Örneğin kalıcı kayıtları PostgreSQL'de, kısa ömürlü sayaç ve lease kayıtlarını Redis'te tutabilirsin.

Transaction katmanı​

TransactionAdapter, domain yazımı ile zorunlu audit/outbox kayıtlarının aynı commit sınırında çalışmasını sağlar. PostgreSQL bağdaştırıcısı iç içe işlemlerde savepoint kullanır.

Başarılı COMMIT sonrasında çalışan bir callback hata verirse domain yazımı geri alınmış sayılmaz. Sonuç, TransactionPostCommitError veya action metadata içindeki postCommitIssues üzerinden gözlemlenir; yazma yeniden çalıştırılmaz.

Realtime katmanı​

createRealtimeHub() bağlantı yetkisini ve teslim sınırlarını taşıyıcıdan ayırır. WebSocket ve Socket.IO mesajları aynı payload, hız, abonelik, etkinlik ve backpressure kontrollerinden geçer. SSE çıkışı da aynı oturum ve kanal yetkisi modeline bağlanabilir.

Sequence ve replay desteği, istemcinin kopma sonrasında kaldığı yerden devam etmesini sağlar. Çoklu worker ortamında olaylar outbox üzerinden claim edilerek dağıtılır.

HTTP ve Discord bağdaştırıcıları​

Paket Fastify, Express ve Hono action handler'ları yayımlar. discord.js bağdaştırıcısı Discord sunucusu ve izin verisini çekirdeğin beklediği dar arayüze çevirir.

Çekirdek route yapısını, veritabanı şemasını veya Discord istemcisinin yaşam döngüsünü yönetmez. Bu kararlar uygulamada kalır.

Bir isteğin ayrıntılı sırası için işlem yaşam döngüsüne bak.