lilydocs
HTTP APIWebSocketConsumer
Yayın2 dk okuma

Odalar

Yetkilendirilmiş oda üyeliği kurun ve aynı namespace’teki oda alıcılarına yayın yapın.

Oda, aynı namespace içindeki bağlantıların yayın grubudur. Oda adı yetki kanıtı değildir; join ve publish kararlarını uygulamanın authorization politikası verir.

Lobby örneği#

Örnek ChatWriteGuard kullanır. src/middleware.rs ve src/rooms.rs modüllerini uygulamaya ekleyin; identity middleware gerçek verifier ile chat:write scope'unu yayımlamalıdır. Guard controller'da kayıtlı olduğundan aynı tipi ayrıca global kaydetmeyin.

rooms.rs
use std::sync::Arc;
use lilyrs::websocket::{Ack, Extensions, NoReply, Payload, WebSocketActionError,
    WebSocketContext, WebSocketController, WebSocketControllerInitError,
    WebSocketControllerTrait, async_trait, websocket_controller};
use serde::{Deserialize, Serialize};
use crate::middleware::ChatWriteGuard;

#[derive(Deserialize, Serialize)]
struct RoomMessage { text: String }

#[derive(WebSocketController)]
#[namespace("chat")]
#[guard(ChatWriteGuard)]
struct ChatController;

#[async_trait]
impl WebSocketControllerTrait for ChatController {
    async fn new(_: Arc<Extensions>) -> Result<Self, WebSocketControllerInitError> { Ok(Self) }
}

#[websocket_controller]
impl ChatController {
    #[message("join")]
    async fn join(&self, context: WebSocketContext) -> Result<Ack<bool>, WebSocketActionError> {
        // Bu örnekte chat:write yetkisi yalnızca sabit lobby odasını açar.
        context.rooms().join("lobby").await.map_err(WebSocketActionError::internal)?;
        Ok(Ack::new(true))
    }
    #[message("publish")]
    async fn publish(&self, context: WebSocketContext, Payload(input): Payload<RoomMessage>)
        -> Result<NoReply, WebSocketActionError>
    {
        context.clients().room("lobby").send("chat:received", input).await
            .map_err(WebSocketActionError::internal)?;
        Ok(NoReply)
    }
}

Tam örnek dosyasını indirin.

chat:join için istemci ACK ID gönderir. chat:publish, lobby alıcılarına event gönderip ek terminal yanıt üretmeden NoReply döndürür. Publisher oda üyesi değilse bu örnekte yayın almak için join yapması gerekir; publish yetkisini burada sabit lobby için chat:write sağlar.

Dinamik odaları yetkilendirin#

Gerçek uygulamada oda adı DTO'dan geliyorsa önce tenant, proje veya nesne erişimini doğrulayın. tenant-42-orders geçerli isim örneğidir; tenant/42:orders route-token gramerine uymaz. Oda adı en fazla 128 ASCII byte ve harf/rakam/-/_/. içerebilir.

Envelope room metadata'sı otomatik join, subscription veya guard oluşturmaz. rooms().join yalnızca uygulamanın açık çağrısıyla üyelik değiştirir. İzin iptalinde üyeliğin ne zaman kaldırılacağını da domain politikanıza ekleyin.

Üyelik ve snapshot#

rooms().join/leave caller için; join_connection/leave_connection aynı namespace'teki explicit bağlantı için kullanılır. Başka namespace'e explicit ID ile geçilemez. rooms().snapshot(name) yerel üyeliği gösterir; Redis backplane açıkken bile global presence görünümü değildir.

Disconnect cleanup'ı üyelikleri kaldırır. Varsayılan bağlantı başına oda sınırı 128'dir. clients().rooms(names) birleşimindeki aynı alıcı bir kez hedeflenir; explicit oda/ID/exclusion listeleri 256 girişle sınırlıdır.

Yayın sonucu#

Odaya send success, hedeflerin gereken kuyruk/publish kabul koşullarını karşıladığını anlatır. Mesajı her kullanıcının gördüğünü veya geçmişte offline olanın sonradan alacağını kanıtlamaz. Kısmi sonuç için receipt, çok node için backplane kullanın.

Bu sayfanın kaynakları v0.1.0

Anlatım, incelenen framework commit’ine dayanır.

HIZLI BAŞLANGIÇ
Dokümantasyon
Kaynak kod