use std::{any::Any, cell::{OnceCell, RefCell}, rc::Rc, sync::{Arc, Mutex, RwLock}}; use bevy_ecs::{system::Resource, world::World}; use futures::{channel::mpsc::{unbounded, UnboundedReceiver, UnboundedSender}, SinkExt}; use wasm_bindgen::{prelude::Closure, JsCast, JsValue}; use wasm_bindgen_futures::spawn_local; use web_sys::{MessageEvent, WebSocket}; use starkingdoms_common::packet::Packet; use crate::ecs::RecvPacket; const PORT: u16 = 3000; #[derive(Debug)] pub struct Socket(WebSocket); unsafe impl Send for Socket {} unsafe impl Sync for Socket {} #[derive(Resource, Debug)] pub struct Ws { socket: Socket, pub sender: UnboundedSender, pub receiver: UnboundedReceiver, packet_receiver: UnboundedReceiver, } impl Ws { pub fn new() -> Result { let window = web_sys::window().unwrap(); let ws = WebSocket::new(&format!("ws://{}:{}", window.location().hostname().unwrap(), PORT))?; let (packet_sender, receiver) = unbounded(); let packet_sender = Rc::new(RwLock::new(packet_sender)); let (sender, packet_receiver) = unbounded(); /*let onopen_callback = Closure::::new(move || { }); ws.set_onopen(Some(onopen_callback.as_ref().unchecked_ref())); onopen_callback.forget();*/ let onmessage_callback = Closure::::new(move |e: MessageEvent| { //tracing::error!("{}", ws.ready_state()); let data = e.data().as_string().expect("Expected string, found some other type"); let data: Packet = serde_json::from_str(&data).expect("Received invalid json from server"); let sender_clone = packet_sender.clone(); spawn_local(async move { sender_clone.write().unwrap().send(data).await.expect("Couldn't transmit packet to client"); }); }); ws.set_onmessage(Some(onmessage_callback.as_ref().unchecked_ref())); onmessage_callback.forget(); Ok(Ws { socket: Socket(ws), sender, receiver, packet_receiver, }) } pub fn send_all_packets_from_channel(&mut self) { 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) { 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"); } }