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:
#[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.