2020-04-06 08:38:08 +02:00
|
|
|
use actix::{Actor, Addr, StreamHandler};
|
|
|
|
use actix_web::web::Data;
|
2020-04-05 15:15:09 +02:00
|
|
|
use actix_web::{get, web, Error, HttpRequest, HttpResponse};
|
|
|
|
use actix_web_actors::ws;
|
|
|
|
|
2020-04-06 08:38:08 +02:00
|
|
|
use jirs_data::{Project, WsMsg};
|
2020-04-05 15:15:09 +02:00
|
|
|
|
2020-04-06 08:38:08 +02:00
|
|
|
use crate::db::projects::LoadCurrentProject;
|
|
|
|
use crate::db::DbExecutor;
|
|
|
|
|
|
|
|
struct WebSocketActor {
|
|
|
|
db: Data<Addr<DbExecutor>>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Actor for WebSocketActor {
|
2020-04-05 15:15:09 +02:00
|
|
|
type Context = ws::WebsocketContext<Self>;
|
|
|
|
}
|
|
|
|
|
2020-04-06 08:38:08 +02:00
|
|
|
impl StreamHandler<Result<ws::Message, ws::ProtocolError>> for WebSocketActor {
|
2020-04-05 15:15:09 +02:00
|
|
|
fn handle(&mut self, msg: Result<ws::Message, ws::ProtocolError>, ctx: &mut Self::Context) {
|
2020-04-06 08:38:08 +02:00
|
|
|
use futures::executor::block_on;
|
|
|
|
|
2020-04-05 15:15:09 +02:00
|
|
|
match msg {
|
|
|
|
Ok(ws::Message::Ping(msg)) => ctx.pong(&msg),
|
|
|
|
Ok(ws::Message::Text(text)) => ctx.text(text),
|
2020-04-06 08:38:08 +02:00
|
|
|
Ok(ws::Message::Binary(bin)) => {
|
|
|
|
let ws_msg: bincode::Result<jirs_data::WsMsg> =
|
|
|
|
bincode::deserialize(bin.to_vec().as_slice());
|
|
|
|
match ws_msg {
|
|
|
|
Ok(WsMsg::Ping) => ctx.binary(bincode::serialize(&WsMsg::Pong).unwrap()),
|
|
|
|
Ok(WsMsg::Pong) => ctx.binary(bincode::serialize(&WsMsg::Ping).unwrap()),
|
|
|
|
Ok(WsMsg::ProjectRequest) => match block_on(load_project(self.db.clone())) {
|
|
|
|
Some(p) => {
|
|
|
|
ctx.binary(bincode::serialize(&WsMsg::ProjectLoaded(p)).unwrap())
|
|
|
|
}
|
|
|
|
_ => eprintln!("Failed to load project"),
|
|
|
|
},
|
|
|
|
_ => eprintln!("Failed to resolve message"),
|
|
|
|
};
|
|
|
|
}
|
2020-04-05 15:15:09 +02:00
|
|
|
_ => (),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-06 08:38:08 +02:00
|
|
|
pub async fn load_project(db: Data<Addr<DbExecutor>>) -> Option<Project> {
|
|
|
|
match db.send(LoadCurrentProject { project_id: 1 }).await {
|
|
|
|
Ok(Ok(p)) => Some(p.into()),
|
|
|
|
Ok(e) => {
|
|
|
|
eprintln!("{:?}", e);
|
|
|
|
None
|
|
|
|
}
|
|
|
|
_ => None,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-05 15:15:09 +02:00
|
|
|
#[get("/ws/")]
|
2020-04-06 08:38:08 +02:00
|
|
|
pub async fn index(
|
|
|
|
req: HttpRequest,
|
|
|
|
stream: web::Payload,
|
|
|
|
db: Data<Addr<DbExecutor>>,
|
|
|
|
) -> Result<HttpResponse, Error> {
|
|
|
|
ws::start(WebSocketActor { db }, &req, stream)
|
2020-04-05 15:15:09 +02:00
|
|
|
}
|