ping fixes

This commit is contained in:
ntr 2019-05-13 18:05:57 +10:00
parent 4f70354b94
commit 577ffd6421
3 changed files with 34 additions and 11 deletions

View File

@ -28,14 +28,18 @@ function createSocket(events) {
// ------------- // -------------
// Outgoing // Outgoing
// ------------- // -------------
let ping = Date.now();
function send(msg) { function send(msg) {
console.log('outgoing msg', msg); console.log('outgoing msg', msg);
ping = Date.now();
msg.token = account && account.token && account.token; msg.token = account && account.token && account.token;
ws.send(cbor.encode(msg)); ws.send(cbor.encode(msg));
} }
let ping;
function sendPing() {
ping = Date.now();
send({ method: 'ping', params: {} });
}
function sendAccountLogin(name, password) { function sendAccountLogin(name, password) {
send({ method: 'account_login', params: { name, password } }); send({ method: 'account_login', params: { name, password } });
} }
@ -230,6 +234,11 @@ function createSocket(events) {
events.setVboxInfo(info); events.setVboxInfo(info);
} }
function pong() {
events.setPing(Date.now() - ping);
setTimeout(sendPing, 1000);
}
// ------------- // -------------
// Setup // Setup
// ------------- // -------------
@ -248,6 +257,7 @@ function createSocket(events) {
zone_close: res => console.log(res), zone_close: res => console.log(res),
instance_state: instanceState, instance_state: instanceState,
vbox_info: vboxInfo, vbox_info: vboxInfo,
pong,
}; };
function logout() { function logout() {
@ -278,7 +288,6 @@ function createSocket(events) {
const { method, params } = res; const { method, params } = res;
console.log(res); console.log(res);
events.setPing(Date.now() - ping);
// check for error and split into response type and data // check for error and split into response type and data
if (res.err) return errHandler(res.err); if (res.err) return errHandler(res.err);
@ -303,6 +312,8 @@ function createSocket(events) {
sendAccountCryps(); sendAccountCryps();
} }
sendPing();
return true; return true;
}); });

View File

@ -1,7 +1,7 @@
use failure::{Error, err_msg};
use tungstenite::Message; use tungstenite::Message;
use tungstenite::protocol::WebSocket; use tungstenite::protocol::WebSocket;
use tungstenite::server::accept; use tungstenite::server::accept;
use tungstenite::error::Error;
use tungstenite::Message::Binary; use tungstenite::Message::Binary;
use std::net::{TcpListener, TcpStream}; use std::net::{TcpListener, TcpStream};
use serde_cbor::{to_vec}; use serde_cbor::{to_vec};
@ -35,18 +35,19 @@ struct RpcErrorResponse {
err: String err: String
} }
fn receive(db: Db, rpc: &Rpc, msg: Message, client: &mut WebSocket<TcpStream>) -> Result<(), Error> { fn receive(db: Db, rpc: &Rpc, msg: Message, client: &mut WebSocket<TcpStream>) -> Result<String, Error> {
match rpc.receive(msg, &db, client) { match rpc.receive(msg, &db, client) {
Ok(reply) => { Ok(reply) => {
let response = to_vec(&reply) let response = to_vec(&reply)
.expect("failed to serialize response"); .expect("failed to serialize response");
client.write_message(Binary(response)) client.write_message(Binary(response))?;
return Ok(reply.method);
}, },
Err(e) => { Err(e) => {
info!("{:?}", e);
let response = to_vec(&RpcErrorResponse { err: e.to_string() }) let response = to_vec(&RpcErrorResponse { err: e.to_string() })
.expect("failed to serialize error response"); .expect("failed to serialize error response");
client.write_message(Binary(response)) client.write_message(Binary(response))?;
return Err(err_msg(e));
} }
} }
} }
@ -120,8 +121,13 @@ pub fn start() {
let begin = Instant::now(); let begin = Instant::now();
let db_connection = db.get().expect("unable to get db connection"); let db_connection = db.get().expect("unable to get db connection");
match receive(db_connection, &rpc, msg, &mut websocket) { match receive(db_connection, &rpc, msg, &mut websocket) {
Ok(_r) => info!("response sent. total duration: {:?}", begin.elapsed()), Ok(method) => {
Err(e) => info!("{:?}", e), match method.as_ref() {
"pong" => (),
_ => info!("response sent. total duration: {:?}", begin.elapsed()),
}
},
Err(e) => warn!("{:?}", e),
} }
}, },
// connection is closed // connection is closed

View File

@ -35,6 +35,10 @@ impl Rpc {
// cast the msg to this type to receive method name // cast the msg to this type to receive method name
match from_slice::<RpcMessage>(&data) { match from_slice::<RpcMessage>(&data) {
Ok(v) => { Ok(v) => {
if v.method == "ping" {
return Ok(RpcResponse { method: "pong".to_string(), params: RpcResult::Pong(()) });
}
info!("message method: {:?}", v.method); info!("message method: {:?}", v.method);
let mut tx = db.transaction()?; let mut tx = db.transaction()?;
@ -382,7 +386,7 @@ impl Rpc {
#[derive(Debug,Clone,Serialize,Deserialize)] #[derive(Debug,Clone,Serialize,Deserialize)]
pub struct RpcResponse { pub struct RpcResponse {
method: String, pub method: String,
params: RpcResult, params: RpcResult,
} }
@ -402,6 +406,8 @@ pub enum RpcResult {
InstanceList(Vec<Instance>), InstanceList(Vec<Instance>),
InstanceState(Instance), InstanceState(Instance),
Pong(()),
} }
#[derive(Debug,Clone,Serialize,Deserialize)] #[derive(Debug,Clone,Serialize,Deserialize)]