Move HELO to actually come from the server
This commit is contained in:
parent
3ac90e59b0
commit
cf513ace26
3 changed files with 34 additions and 11 deletions
31
src/main.rs
31
src/main.rs
|
@ -2,9 +2,10 @@
|
||||||
extern crate log;
|
extern crate log;
|
||||||
|
|
||||||
use anyhow::{Context, Error, Result};
|
use anyhow::{Context, Error, Result};
|
||||||
|
use future::ok;
|
||||||
use futures::prelude::*;
|
use futures::prelude::*;
|
||||||
use net::{ClientMessage, ServerMessage};
|
use net::{ClientMessage, Meta, ServerMessage};
|
||||||
use serde_json::{from_str, Value};
|
use serde_json::{from_str, json, to_string, Value};
|
||||||
use std::net::ToSocketAddrs;
|
use std::net::ToSocketAddrs;
|
||||||
use stream::{iter, FuturesUnordered};
|
use stream::{iter, FuturesUnordered};
|
||||||
use structopt::StructOpt;
|
use structopt::StructOpt;
|
||||||
|
@ -46,7 +47,31 @@ async fn main() -> Result<()> {
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn handle_socket(websocket: WebSocket) {
|
async fn handle_socket(websocket: WebSocket) {
|
||||||
let (_sink, mut source) = websocket.split();
|
let (sink, mut source) = websocket.split();
|
||||||
|
|
||||||
|
let mut sink = sink.with(|msg: ServerMessage<Vec<Value>, Value>| {
|
||||||
|
let json = to_string(&msg).expect("JSON encoding shouldn't fail");
|
||||||
|
ok::<Message, Error>(Message::text(json))
|
||||||
|
});
|
||||||
|
|
||||||
|
let mut greeting = iter(vec![
|
||||||
|
ServerMessage::Meta {
|
||||||
|
m: Meta {
|
||||||
|
version: "Unstable",
|
||||||
|
helo: Some("Dedicated base2020 server".into()),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ServerMessage::SetState {
|
||||||
|
u: 0,
|
||||||
|
s: json!({}),
|
||||||
|
},
|
||||||
|
])
|
||||||
|
.map(Ok);
|
||||||
|
|
||||||
|
if let Err(err) = sink.send_all(&mut greeting).await {
|
||||||
|
warn!("Websocket send error: {:#}", err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let error: Option<Error> = loop {
|
let error: Option<Error> = loop {
|
||||||
match source.next().await {
|
match source.next().await {
|
||||||
|
|
|
@ -20,11 +20,6 @@ export class Connection<LocalInput, State> {
|
||||||
const ws = new WebSocket(this.url);
|
const ws = new WebSocket(this.url);
|
||||||
|
|
||||||
const source: Source<ServerMessage<LocalInput[], State>> = create((data, { }, close) => {
|
const source: Source<ServerMessage<LocalInput[], State>> = create((data, { }, close) => {
|
||||||
ws.onopen = () => {
|
|
||||||
// fake a HELO message & set state message until the server actually sends them
|
|
||||||
data({ t: MessageTypes.META, helo: "Websocket Server" });
|
|
||||||
data({ t: MessageTypes.SET_STATE, u: 0, s: {} });
|
|
||||||
};
|
|
||||||
ws.onmessage = msg => {
|
ws.onmessage = msg => {
|
||||||
const decoded: Jsonified<ServerMessage<LocalInput[], State>> = JSON.parse(msg.data);
|
const decoded: Jsonified<ServerMessage<LocalInput[], State>> = JSON.parse(msg.data);
|
||||||
data(decoded as ServerMessage<LocalInput[], State>);
|
data(decoded as ServerMessage<LocalInput[], State>);
|
||||||
|
|
|
@ -13,15 +13,18 @@ pub enum ClientMessage<I, S> {
|
||||||
|
|
||||||
#[derive(Serialize, Debug)]
|
#[derive(Serialize, Debug)]
|
||||||
pub struct Meta {
|
pub struct Meta {
|
||||||
helo: Option<String>,
|
pub helo: Option<String>,
|
||||||
version: &'static str,
|
pub version: &'static str,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Debug)]
|
#[derive(Serialize, Debug)]
|
||||||
#[serde(tag = "t")]
|
#[serde(tag = "t")]
|
||||||
pub enum ServerMessage<I, S> {
|
pub enum ServerMessage<I, S> {
|
||||||
#[serde(rename = "m")]
|
#[serde(rename = "m")]
|
||||||
Meta { m: Meta },
|
Meta {
|
||||||
|
#[serde(flatten)]
|
||||||
|
m: Meta,
|
||||||
|
},
|
||||||
#[serde(rename = "s")]
|
#[serde(rename = "s")]
|
||||||
SetState { u: i8, s: S },
|
SetState { u: i8, s: S },
|
||||||
#[serde(rename = "i")]
|
#[serde(rename = "i")]
|
||||||
|
|
Loading…
Reference in a new issue