This commit is contained in:
azw 2023-11-12 01:42:11 +00:00
parent c10d482f9d
commit 047cff79cb

View File

@ -0,0 +1,64 @@
use std::rc::{Rc, Weak};
use std::cell::RefCell;
use r9_macro::SharedFromSelf;
use r9_macro_derive::SharedFromSelf;
use r9_macro_derive::Singleton;
use actix::StreamHandler;
use actix_web_actors::ws::{self, Message};
#[derive(SharedFromSelf)]
#[derive(Singleton)]
pub struct WsListener {
_self_wp: Weak::<RefCell::<Self>>,
}
/// Define HTTP actor
struct WsConn;
impl Actor for WsConn {
type Context = ws::WebsocketContext<Self>;
}
impl StreamHandler<Result<Message, ws::ProtocolError>> for WsConn {
fn handle(&mut self, item: Result<Message, ws::ProtocolError>, ctx: &mut Self::Context) {
match item {
Ok(Message::Text(text)) => ctx.text(text),
Ok(Message::Ping(msg)) => ctx.pong(&msg),
Ok(Message::Binary(bin)) => ctx.binary(bin),
Ok(Message::Close(reason)) => ctx.close(reason),
_ => (),
}
}
}
async fn index(req: HttpRequest, stream: web::Payload) -> Result<HttpResponse, Error> {
let resp = ws::start(WsConn{}, &req, stream);
println!("{:?}", resp);
resp
}
async fn run_app(port: u16, app_state: Arc::<AppState>,
tx: std::sync::mpsc::Sender<ServerHandle>) -> std::io::Result<()> {
let server = HttpServer::new(move || {
WebApp::new()
.route("/",web::get().to(index))
})
.bind(("0.0.0.0", port))?
.workers(1)
.run();
let _ = tx.send(server.handle());
server.await
}
impl WsListener {
pub fn new() -> Self {
let p = Self{
_self_wp: Default::default(),
};
return p;
}
}