70 lines
2.1 KiB
Rust
Executable File
70 lines
2.1 KiB
Rust
Executable File
use ws::{listen, Handler, Sender, Result, Message, Handshake, CloseCode, Error};
|
|
use serde_cbor::{to_vec};
|
|
|
|
use std::env;
|
|
|
|
use r2d2::{Pool};
|
|
use r2d2::{PooledConnection};
|
|
use r2d2_postgres::{TlsMode, PostgresConnectionManager};
|
|
|
|
pub type Db = PooledConnection<PostgresConnectionManager>;
|
|
|
|
use rpc::{Rpc};
|
|
|
|
struct Server {
|
|
out: Sender,
|
|
rpc: Rpc,
|
|
db: Pool<PostgresConnectionManager>,
|
|
}
|
|
|
|
impl Handler for Server {
|
|
fn on_open(&mut self, _: Handshake) -> Result<()> {
|
|
println!("somebody joined");
|
|
Ok(())
|
|
}
|
|
|
|
fn on_message(&mut self, msg: Message) -> Result<()> {
|
|
let db = self.db.get().expect("unable to get db connection");
|
|
match self.rpc.receive(msg, db) {
|
|
Ok(reply) => {
|
|
let response = to_vec(&reply)
|
|
.expect("failed to serialize response");
|
|
self.out.send(response)
|
|
},
|
|
Err(e) => {
|
|
let response = to_vec(&e.to_string())
|
|
.expect("failed to serialize error response");
|
|
self.out.send(response)
|
|
}
|
|
}
|
|
}
|
|
|
|
fn on_close(&mut self, code: CloseCode, reason: &str) {
|
|
match code {
|
|
CloseCode::Normal => println!("The client is done with the connection."),
|
|
CloseCode::Away => println!("The client is leaving the site."),
|
|
CloseCode::Abnormal => println!(
|
|
"Closing handshake failed! Unable to obtain closing status from client."),
|
|
_ => println!("The client encountered an error: {}", reason),
|
|
}
|
|
}
|
|
|
|
fn on_error(&mut self, err: Error) {
|
|
println!("The server encountered an error: {:?}", err);
|
|
}
|
|
}
|
|
|
|
pub fn start() {
|
|
let database_url = env::var("DATABASE_URL")
|
|
.expect("DATABASE_URL must be set");
|
|
|
|
let manager = PostgresConnectionManager::new(database_url, TlsMode::None)
|
|
.expect("could not instantiate pg manager");
|
|
|
|
let pool = Pool::builder()
|
|
.build(manager)
|
|
.expect("Failed to create pool.");
|
|
|
|
listen("127.0.0.1:40000", |out| { Server { out, rpc: Rpc {}, db: pool.clone() } }).unwrap();
|
|
}
|