~starkingdoms/starkingdoms

f6640dd5389923f136f18c68b3d7244011c6f91d — core 8 months ago aa29b11
networking cleanup
M crates/client/src/lib.rs => crates/client/src/lib.rs +2 -1
@@ 2,7 2,8 @@ use crate::components::PlayerResources;
use bevy_ecs::{event::Events, world::World};
use components::{Camera, Chat, Part, Player, RecvPacket, SendPacket, Texture, Transform};
use nalgebra::{Rotation2, Scale3, Translation3};
use networking::ws::Ws;
use platform::websocket::Ws;
use crate::networking::websocket::Websocket;
use platform::assets::Assets;
use rendering::assets::AssetLoader;
use rendering::App;

M crates/client/src/native/mod.rs => crates/client/src/native/mod.rs +1 -0
@@ 1,4 1,5 @@
pub mod assets;
pub mod websocket;

/// --- IMPORTANT: THIS IS A DUAL TARGET CRATE ---
/// THIS WILL ONLY EXECUTE ON NATIVE

R crates/client/src/networking/ws_native.rs => crates/client/src/native/websocket.rs +8 -10
@@ 7,13 7,11 @@ use bevy_ecs::system::Resource;
use crossbeam::channel::{unbounded, Receiver, Sender};
use starkingdoms_common::packet::{MsgFromError, Packet};
use tungstenite::{connect, stream::MaybeTlsStream, Message, WebSocket};

pub trait PacketMessageConvert {
    fn from_message(value: &Message) -> Result<Packet, MsgFromError>;
    fn into_message(&self) -> Message;
}
use crate::networking::websocket::{PacketMessageConvert, Websocket};

impl PacketMessageConvert for Packet {
    type M = Message;

    fn from_message(value: &Message) -> Result<Packet, MsgFromError> {
        match value {
            Message::Text(s) => serde_json::from_str(s).map_err(MsgFromError::JSONError),


@@ 24,7 22,7 @@ impl PacketMessageConvert for Packet {
            }
        }
    }
    fn into_message(&self) -> Message {
    fn as_message(&self) -> Message {
        Message::Text(
            serde_json::to_string(self)
                .expect("failed to serialize packet to json")


@@ 40,8 38,8 @@ pub struct Ws {
    pub receiver: Receiver<Packet>,
    packet_receiver: Receiver<Packet>,
}
impl Ws {
    pub fn new() -> Self {
impl Websocket for Ws {
    fn new() -> Self {
        let (socket, _) = connect("ws://localhost:3000").expect("Failed to connect to server");
        let socket = Arc::new(Mutex::new(socket));
        let (packet_sender, receiver) = unbounded();


@@ 68,11 66,11 @@ impl Ws {
            packet_receiver,
        }
    }
    pub fn send_packet(&mut self, packet: Packet) {
    fn send_packet(&mut self, packet: Packet) {
        self.socket
            .lock()
            .unwrap()
            .send(packet.into_message())
            .send(packet.as_message())
            .expect("Couldn't send packet to server");
    }
}

M crates/client/src/networking/mod.rs => crates/client/src/networking/mod.rs +1 -6
@@ 14,12 14,7 @@ use crate::components::{
    SpriteBundle, Texture, Transform,
};

#[cfg(target_arch = "wasm32")]
#[path = "ws_wasm.rs"]
pub mod ws;
#[cfg(not(target_arch = "wasm32"))]
#[path = "ws_native.rs"]
pub mod ws;
pub mod websocket;

fn texture_name(part_type: PartType, attached: bool) -> String {
    use PartType::*;

A crates/client/src/networking/websocket.rs => crates/client/src/networking/websocket.rs +13 -0
@@ 0,0 1,13 @@
use starkingdoms_common::packet::{MsgFromError, Packet};

pub trait Websocket {
    fn new() -> Self;
    fn send_packet(&mut self, packet: Packet);
}

pub trait PacketMessageConvert {
    type M;

    fn from_message(value: &Self::M) -> Result<Packet, MsgFromError>;
    fn as_message(&self) -> Self::M;
}
\ No newline at end of file

M crates/client/src/rendering/mod.rs => crates/client/src/rendering/mod.rs +2 -1
@@ 39,9 39,10 @@ use winit::{

use crate::components::{Camera, Menu, Player, RecvPacket, SendPacket, Texture, Transform};
use crate::networking::process_packets;
use crate::networking::ws::Ws;
use crate::platform::websocket::Ws;
use crate::ui::{draw_ui, init_ui};
use assets::AssetLoader;
use crate::networking::websocket::Websocket;

pub mod assets;


M crates/client/src/wasm/mod.rs => crates/client/src/wasm/mod.rs +1 -0
@@ 5,6 5,7 @@ use tracing_web::{performance_layer, MakeWebConsoleWriter};
use wasm_bindgen::prelude::wasm_bindgen;

pub mod assets;
pub mod websocket;

/// --- IMPORTANT: THIS IS A DUAL TARGET CRATE ---
/// THIS WILL ONLY EXECUTE ON WEBASSEMBLY

R crates/client/src/networking/ws_wasm.rs => crates/client/src/wasm/websocket.rs +4 -14
@@ 10,6 10,7 @@ use starkingdoms_common::packet::Packet;
use wasm_bindgen::{prelude::Closure, JsCast, JsValue};
use wasm_bindgen_futures::spawn_local;
use web_sys::{MessageEvent, WebSocket};
use crate::networking::websocket::Websocket;

const PORT: u16 = 3000;



@@ 26,8 27,8 @@ pub struct Ws {
    packet_receiver: UnboundedReceiver<Packet>,
}

impl Ws {
    pub fn new() -> Self {
impl Websocket for Ws {
    fn new() -> Self {
        let window = web_sys::window().unwrap();
        /*let ws = WebSocket::new(&format!(
            "ws://{}:{}",


@@ 80,18 81,7 @@ impl Ws {
            packet_receiver,
        }
    }
    pub fn send_all_packets_from_channel(&mut self) {
        //for packet in self.packet_receiver.iter() {
        while let Ok(Some(packet)) = self.packet_receiver.try_next() {
            self.socket
                .0
                .send_with_str(
                    &serde_json::to_string(&packet).expect("Couldn't convert packet to json"),
                )
                .expect("Couldn't send packet to server");
        }
    }
    pub fn send_packet(&mut self, packet: Packet) {
    fn send_packet(&mut self, packet: Packet) {
        let socket = self.socket.0.clone();
        spawn_local(async move {
            //while socket.ready_state() != 1 {  }