lilydocs
HTTP APIWebSocketConsumer
Başlangıç3 dk okuma

İlk WebSocket uygulaması

Bir namespace açın, typed mesaj alın ve çağıran istemciye event veya ACK döndürün.

Bu sayfada hello:greet mesajına hello:greeted event'i döndüren bir sunucu kuracağız. İkinci action, hello:confirm, gelen veriyi ilişkili bir ACK ile cevaplayacak.

Projeyi hazırlayın#

Bu rehber crates.io'da yayımlanan lilyrs 0.1.0 facade'ini kullanır. Manifestin Rust alt sınırı ve projenin doğruladığı toolchain 1.96.1'dir; edition 2024 kullanılır. Framework checkout'u gerekmez. Yeni bir proje oluşturun:

Terminal
cargo new hello-lily-ws
Cargo.toml
[package]
name = "hello-lily-ws"
version = "0.1.0"
edition = "2024"
rust-version = "1.96.1"

[dependencies]
lilyrs = { version = "0.1.0", features = ["websocket"] }
serde = { version = "1", features = ["derive"] }
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }

websocket feature'ı lilyrs::websocket modülünü açar. lilyrs varsayılan olarak bileşen açmaz; feature adı tireli, import yolu alt çizgili olabilir. Controller makroları, async_trait ve Injectable aynı framework kökünden gelir; kendi DI servisleriniz için ayrı registry/derive bağımlılığı gerekmez. Buradaki #[tokio::main] nedeniyle Tokio doğrudan bağımlılık olarak kalır.

Entegrasyon eklerken aynı lilyrs satırının feature listesine gereken bileşeni ekleyin. postgresql, mongodb, redis ve websocket-client single modunu seçer; factory gerekiyorsa ilgili base feature yerine *-factory kullanın. Cargo feature'ları birleştiğinden ikisini aynı bağımlılık grafiğinde açmayın ve --all-features kullanmayın. Dış client'ın manuel sahiplik profili client rehberinde ayrıca açıklanır.

Controller ve sunucu#

Aşağıdaki dosyayı src/main.rs olarak kaydedin:

first_app.rs
use std::sync::Arc;
use lilyrs::websocket::{
    Ack, Emit, Extensions, Payload, ServerConfig, WebSocketActionError,
    WebSocketController, WebSocketControllerInitError, WebSocketControllerTrait,
    WsAppBuilder, async_trait, websocket_controller,
};
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize)]
struct Greeting { name: String }

#[derive(WebSocketController)]
#[namespace("hello")]
struct HelloController;

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

#[websocket_controller]
impl HelloController {
    #[message("greet")]
    async fn greet(&self, Payload(input): Payload<Greeting>)
        -> Result<Emit<String>, WebSocketActionError>
    {
        Emit::new("hello:greeted", format!("Merhaba, {}!", input.name))
            .map_err(WebSocketActionError::internal)
    }

    #[message("confirm")]
    async fn confirm(&self, Payload(input): Payload<Greeting>)
        -> Result<Ack<Greeting>, WebSocketActionError>
    {
        Ok(Ack::new(input))
    }
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let app = WsAppBuilder::new("127.0.0.1:8081")
        .config(ServerConfig {
            allowed_origins: vec!["http://localhost:3000".into()],
            require_subprotocol: true,
            ..ServerConfig::default()
        })
        .build().await?;
    app.start().await?;
    Ok(())
}

Tam örnek dosyasını indirin.

#[namespace("hello")] bağlantının alanını, #[message("greet")] action adını belirler. Birlikte hello:greet route'unu oluştururlar. Controller'lar link sırasında keşfedilir; ayrıca add_controller çağrısı yoktur. Örneğin başka bir modüle taşınması durumunda modülü mod bildirimiyle uygulamaya dahil edin.

Çalıştırın ve bağlanın#

Terminal
cd hello-lily-ws
cargo run

Sunucu 127.0.0.1:8081 üzerinde, /ws?namespace=hello adresinde bağlantı kabul eder. Örnek yalnızca http://localhost:3000 Origin'ine izin verir ve lily.v2 subprotocol'ünü zorunlu tutar. İlk istemci sayfasındaki kodu bu Origin'den çalıştırın. 127.0.0.1:3000, localhost:3000 ile aynı Origin değildir.

Emit yalnızca çağıran bağlantıya event üretir. Diğer istemcilere yayın için daha sonra client hedeflerini kullanacağız. Ack için istemci ack_id göndermelidir; sunucu eksik ID'yi kendisi oluşturmaz.

Kapatın#

Terminalde Ctrl+C kapanışı başlatır. start().await uygulamanın kapanış sonucunu döndürür. Başarılı bir build sonrasında henüz start çağırmadıysanız app.close().await ile kaynakları kapatın. Değeri düşürmek async cleanup'ın tamamlandığını kanıtlamaz.

Bu ilk uygulama gerçek loopback bağlantısıyla event, ACK, eksik ACK ID ve kapanış senaryolarında doğrulanmıştır. Testin kurulumu test etme sayfasındadır.

Bu sayfanın kaynakları v0.1.0

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

HIZLI BAŞLANGIÇ
Dokümantasyon
Kaynak kod