lilydocs
HTTP APIWebSocketConsumer
Mesajlar2 dk okuma

Context ve local veri

Bağlantı yetkisi, mesaj metadata’sı ve typed local veriyi doğru ömürlerde kullanın.

Context bağlantıya erişim sağlar; local veri belirli bir işleme ait küçük typed değerleri taşır. DI servisi ile local DTO'nun ömrünü birbirine karıştırmayın.

Bağlantı ve mesaj context’i#

WebSocketContext, namespace, bağlantı kimliği, client hedefleri, odalar ve identity erişimini toplar. Action içinde mesajın kimlik snapshot'ına bağlı görünümü taşır. WebSocketMessageContext, event, mesaj ID, timestamp, deadline, cancellation ve envelope metadata'sını sunar.

handshake_headers() orijinal Upgrade bilgisidir. MessageHeaders ise envelope metadata'sıdır. message_age() bir mesajın, connection_age()/uptime() bağlantının zamanını ölçer. Bu değerleri aynı gecikme metriği olarak kullanmayın.

Üç local sınırı#

Veri Yazılacağı yer Yaşadığı süre
Handshake local WsHandshakeExchange::insert_local Handshake/identity adımları
Connection local Identity sonucunun insert_connection_local metodu Bağlantı boyunca immutable
Message local WsMessageExchange::insert_message_local Tek mesaj pipeline'ı

Handshake local'ler otomatik connection local olmaz. Identity sonucunda sadece gereken owned veriyi açıkça taşıyın. Handshake ve connection local tipleri için sınır 32'dir. Clone/Send/Sync gereksinimlerine uygun küçük DTO'lar kullanın; scope'a ait kaynakları saklamayın.

Middleware’den action’a veri#

MessageTimer örneği StartedAt(tokio::time::Instant) değerini mesaj local'ine yazar. Action bunu optional olarak okuyabilir:

Action imza parçası
#[message("timed")]
async fn timed(
    &self,
    started: Option<lilyrs::websocket::MessageLocal<StartedAt>>,
) -> Result<lilyrs::websocket::NoReply, lilyrs::websocket::WebSocketActionError> {
    if let Some(lilyrs::websocket::MessageLocal(StartedAt(start))) = started {
        let _elapsed = start.elapsed();
    }
    Ok(lilyrs::websocket::NoReply)
}

Bu parçayı bir controller macro impl'ine ekleyin ve örnekteki StartedAt tipini import edin. Middleware kaydı yoksa optional extractor None verir; required local kullanılacaksa ilgili middleware'i route'un planına dahil edin.

Kimlik yenilenince ne olur?#

İşlenmekte olan mesajın Principal snapshot'ı sabittir. Refresh, aynı mesajın guard ile action arasında başka kimlik görmesine yol açmaz. Sonraki mesaj yeni kimliği alır. Connection locals refresh ile değiştirilmez; identity lifecycle bu sınırı açıklar.

Bir local'e Scoped servis Arc'ı koymak scope temizliğini geciktirmez. Kaynağı aktif exchange'ten tekrar çözün veya uzun yaşam gerekiyorsa doğru DI lifetime'ı seçin. Context klonlamak da sınırsız background send veya shutdown sonrası execution yetkisi oluşturmaz; cancellation ve shutdown sınırları korunur.

Bu sayfanın kaynakları v0.1.0

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

HIZLI BAŞLANGIÇ
Dokümantasyon
Kaynak kod