From 047cff79cb33ddf14fc490fd6f23163028bd99fc Mon Sep 17 00:00:00 2001 From: azw Date: Sun, 12 Nov 2023 01:42:11 +0000 Subject: [PATCH] 1 --- server/stat/src/listener/wslistener.rs | 64 ++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 server/stat/src/listener/wslistener.rs diff --git a/server/stat/src/listener/wslistener.rs b/server/stat/src/listener/wslistener.rs new file mode 100644 index 0000000..76670ab --- /dev/null +++ b/server/stat/src/listener/wslistener.rs @@ -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::>, +} + +/// Define HTTP actor +struct WsConn; + +impl Actor for WsConn { + type Context = ws::WebsocketContext; +} + +impl StreamHandler> for WsConn { + fn handle(&mut self, item: Result, 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 { + let resp = ws::start(WsConn{}, &req, stream); + println!("{:?}", resp); + resp +} + +async fn run_app(port: u16, app_state: Arc::, + tx: std::sync::mpsc::Sender) -> 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; + } + +}