diff --git a/src/main.rs b/src/main.rs index 6453754..37e742b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,9 +2,10 @@ extern crate log; use anyhow::{Context, Error, Result}; +use future::ok; use futures::prelude::*; -use net::{ClientMessage, ServerMessage}; -use serde_json::{from_str, Value}; +use net::{ClientMessage, Meta, ServerMessage}; +use serde_json::{from_str, json, to_string, Value}; use std::net::ToSocketAddrs; use stream::{iter, FuturesUnordered}; use structopt::StructOpt; @@ -46,7 +47,31 @@ async fn main() -> Result<()> { } 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, Value>| { + let json = to_string(&msg).expect("JSON encoding shouldn't fail"); + ok::(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 = loop { match source.next().await { diff --git a/src/net/Connection.ts b/src/net/Connection.ts index cae44c9..202d878 100644 --- a/src/net/Connection.ts +++ b/src/net/Connection.ts @@ -20,11 +20,6 @@ export class Connection { const ws = new WebSocket(this.url); const source: Source> = 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 => { const decoded: Jsonified> = JSON.parse(msg.data); data(decoded as ServerMessage); diff --git a/src/net/mod.rs b/src/net/mod.rs index 9573fd3..4477556 100644 --- a/src/net/mod.rs +++ b/src/net/mod.rs @@ -13,15 +13,18 @@ pub enum ClientMessage { #[derive(Serialize, Debug)] pub struct Meta { - helo: Option, - version: &'static str, + pub helo: Option, + pub version: &'static str, } #[derive(Serialize, Debug)] #[serde(tag = "t")] pub enum ServerMessage { #[serde(rename = "m")] - Meta { m: Meta }, + Meta { + #[serde(flatten)] + m: Meta, + }, #[serde(rename = "s")] SetState { u: i8, s: S }, #[serde(rename = "i")]