62 lines
1.4 KiB
Markdown
62 lines
1.4 KiB
Markdown
|
# Actix WS
|
||
|
_websockets for the Actix Runtime without actors_
|
||
|
|
||
|
## Usage
|
||
|
```toml
|
||
|
# Cargo.toml
|
||
|
anyhow = "1.0"
|
||
|
actix-rt = "1.1.0"
|
||
|
actix-web = "3.0.0-alpha.1"
|
||
|
actix-ws = "0.1.0-alpha.0"
|
||
|
```
|
||
|
|
||
|
```rust
|
||
|
// main.rs
|
||
|
use actix_web::{middleware::Logger, web, App, Error, HttpRequest, HttpResponse, HttpServer};
|
||
|
use actix_ws::Message;
|
||
|
|
||
|
async fn ws(req: HttpRequest, body: web::Payload) -> Result<HttpResponse, Error> {
|
||
|
let (response, mut session, mut msg_stream) = actix_ws::handle(&req, body)?;
|
||
|
|
||
|
actix_rt::spawn(async move {
|
||
|
while let Some(Ok(msg)) = msg_stream.next().await {
|
||
|
match msg {
|
||
|
Message::Ping(bytes) => {
|
||
|
if session.pong(&bytes).await.is_err() {
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
Message::Text(s) => println!("Got text, {}", s),
|
||
|
_ => break,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
let _ = session.close(None).await;
|
||
|
});
|
||
|
|
||
|
Ok(response)
|
||
|
}
|
||
|
|
||
|
#[actix_rt::main]
|
||
|
async fn main() -> Result<(), anyhow::Error> {
|
||
|
HttpServer::new(move || {
|
||
|
App::new()
|
||
|
.wrap(Logger::default())
|
||
|
.route("/ws", web::get().to(ws))
|
||
|
})
|
||
|
.bind("127.0.0.1:8080")?
|
||
|
.run()
|
||
|
.await?;
|
||
|
|
||
|
Ok(())
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## License
|
||
|
This project is licensed under either of
|
||
|
|
||
|
- Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
|
||
|
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
|
||
|
|
||
|
at your option.
|