lilydocs
HTTP APIWebSocketConsumer
Genişletme2 dk okuma

Frame ve payload codec

Wire zarfı ile payload dönüşümünü ayrı genişletin; seçilen codec’in hangi gönderim yollarına uygulandığını bilin.

Varsayılan LilyEnvelopeCodec, frame ve payload görevlerini birlikte uygular. Custom codec yazarken route'u bulmak için gereken zarf ile DTO içeriğini dönüştürme işini ayırın.

Seçim sırası#

Codec önceliği
Frame: controller override → app default
Payload: action override → controller override → app default

Action bulunmadan frame decode edilmesi gerektiği için action-level frame codec yoktur. Aynı concrete codec'i miras alındığı seviyede tekrar belirtmek build'de duplicate component hatasıdır. Varsayılan LilyEnvelopeCodec'i controller'a gereksiz tekrar eklemeyin.

Payload codec örneği#

Örnek mevcut codec'e delege eder; yeni CBOR, MessagePack veya gzip desteği eklemez. Public trait ve factory bağlama biçimini gösterir:

codecs.rs
use std::sync::Arc;
use lilyrs::websocket::{DecodedWebSocketPayload, EncodedWebSocketPayload, Extensions,
    LilyEnvelopeCodec, WebSocketCodecError, WebSocketCodecFactory,
    WebSocketCodecInitError, WebSocketPayloadCodec, WsAppBuilder, async_trait};

pub struct ApplicationPayloadCodec;
#[async_trait]
impl WebSocketCodecFactory for ApplicationPayloadCodec {
    async fn new(_: Arc<Extensions>) -> Result<Self, WebSocketCodecInitError> { Ok(Self) }
}
impl WebSocketPayloadCodec for ApplicationPayloadCodec {
    fn decode_payload(&self, payload: EncodedWebSocketPayload)
        -> Result<DecodedWebSocketPayload, WebSocketCodecError>
    { LilyEnvelopeCodec.decode_payload(payload) }
    fn encode_payload(&self, payload: DecodedWebSocketPayload)
        -> Result<EncodedWebSocketPayload, WebSocketCodecError>
    { LilyEnvelopeCodec.encode_payload(payload) }
}
pub fn with_codec(builder: WsAppBuilder) -> WsAppBuilder {
    builder.payload_codec::<ApplicationPayloadCodec>()
}

Tam örnek dosyasını indirin.

with_codec(builder) dönüşünü build edin. Controller/action payload override'ı #[payload_codec(ApplicationPayloadCodec)], controller frame override'ı #[frame_codec(MyFrameCodec)] biçimindedir. Sadece bir seviyede gerekli seçimi yapın; aynı tipe redundant override eklemeyin.

Constructor ve senkron işler#

WebSocketCodecFactory::new(Arc<Extensions>) async ve fallible'dır. Gerçek custom bağımlılık I/O'su kendi bounded politikasını kullanmalıdır. decode/encode metodları senkron olduğundan hızlı ve non-blocking kalır. Framework panic'i sınırlandırabilir; bloklayan kodu ortasında preempt edemez.

Payload codec EncodedWebSocketPayload ile DecodedWebSocketPayload arasındaki kontratı her iki yönde yerine getirir. RawEnvelope tek tüketim hakkıyla orijinal frame'e erişir; iki payload extractor'ıyla veriyi iki kez okumak için kestirme değildir.

Gönderim yolu sınırı#

Typed action Ack/Emit/error terminal çıktıları seçilmiş codec'lerden geçer. context.clients().send/send_binary ise canonical WsMessageBody broadcast yolunu kullanır. Custom action payload codec'i bütün yayınları otomatik değiştirmez.

Rust client'ın inbound yolu da canonical Lily v2 bekler. Custom wire seçiyorsanız istemci, action yanıtı ve fan-out uyumluluğunu birlikte test edin. Message protocol default envelope'u, testing gerekli doğrulama sınırlarını açıklar.

Bu sayfanın kaynakları v0.1.0

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

HIZLI BAŞLANGIÇ
Dokümantasyon
Kaynak kod