From 6f80f62bf35159e046f900012d6636664c7c22bd Mon Sep 17 00:00:00 2001 From: core Date: Thu, 3 Jul 2025 00:35:06 -0400 Subject: [PATCH] failure to wasm aaaaaaaaaaaaaaaaaaaaaaaaaaaaa --- .gitignore | 4 +++ Cargo.lock | 4 +++ crates/unified/Cargo.toml | 10 ++++++++ crates/unified/index.html | 27 +++++++++++++++++++ crates/unified/src/client/mod.rs | 10 +++++--- crates/unified/src/client_plugins.rs | 1 + crates/unified/src/lib.rs | 15 +++++++++++ crates/unified/src/main.rs | 22 +++++----------- crates/unified/src/server/mod.rs | 37 +++++++++++++++++---------- crates/unified/src/wasm_entrypoint.rs | 24 +++++++++++++++++ crates/xtask/src/main.rs | 21 ++++++++++++++- 11 files changed, 140 insertions(+), 35 deletions(-) create mode 100644 crates/unified/index.html create mode 100644 crates/unified/src/lib.rs create mode 100644 crates/unified/src/wasm_entrypoint.rs diff --git a/.gitignore b/.gitignore index 070845ad208d6358d3c75efad4a00bd9347b9815..cb2df7b3bd73771fd92161a3067f361b7fdef254 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,7 @@ crates/api/.env crates/backplane/config.toml crates/kabel/tmp.kab + +crates/unified/web +crates/unified/web/ +crates/unified/web/* \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 0ff269ab8ea937eebbc8838aaba7b53444c2340b..54ea43b9ff253d0333247238dcae9d921419595a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7904,13 +7904,17 @@ dependencies = [ "bevy_replicon", "bevy_replicon_renet2", "clap", + "console_error_panic_hook", "getrandom 0.3.3", "log", "rand 0.9.1", "serde", "tokio", "tracing-subscriber", + "tracing-wasm", "url", + "wasm-bindgen", + "web-time 1.1.0", ] [[package]] diff --git a/crates/unified/Cargo.toml b/crates/unified/Cargo.toml index 83daeb138ce2841bb2571b6e0ee10865b0c568b4..3c9e10a31f1657b18d724f9e98a39a45787151fa 100644 --- a/crates/unified/Cargo.toml +++ b/crates/unified/Cargo.toml @@ -4,6 +4,9 @@ description = "A game about floating through space" edition = "2024" version = "0.1.0" +[lib] +crate-type = ["cdylib", "rlib"] + [dependencies] bevy = { version = "0.16", features = ["serialize", "tonemapping_luts"] } bevy_rapier2d = { version = "0.30", features = ["serde-serialize", "simd-stable"] } @@ -23,9 +26,16 @@ serde = { version = "1", features = ["derive"] } rand = "0.9" getrandom = { version = "0.3", features = [] } +web-time = "1" + [target.'cfg(not(target_arch = "wasm32"))'.dependencies] tokio = { version = "1", features = ["rt-multi-thread"] } +[target.'cfg(target_arch = "wasm32")'.dependencies] +wasm-bindgen = { version = "0.2" } +tracing-wasm = "0.2" +console_error_panic_hook = "0.1" + [features] default = ["native"] native = ["bevy/file_watcher", "bevy_replicon_renet2/native_transport", "bevy_replicon_renet2/ws_server_transport"] diff --git a/crates/unified/index.html b/crates/unified/index.html new file mode 100644 index 0000000000000000000000000000000000000000..ee893f35cf69126e608fbd41927b7cfdb51a7d73 --- /dev/null +++ b/crates/unified/index.html @@ -0,0 +1,27 @@ + + + + starkingdoms + + + + + + + \ No newline at end of file diff --git a/crates/unified/src/client/mod.rs b/crates/unified/src/client/mod.rs index c840e55da91d64b8292ccbad99946aa5a2cfa5a2..efdd83f7d386d02dc114b7a921e8d7991a4ab8e2 100644 --- a/crates/unified/src/client/mod.rs +++ b/crates/unified/src/client/mod.rs @@ -20,8 +20,9 @@ use bevy_replicon_renet2::netcode::{ClientAuthentication, NetcodeClientTransport #[cfg(target_arch = "wasm32")] use bevy_replicon_renet2::netcode::{ClientSocket, WebSocketClient, WebSocketClientConfig}; use bevy_replicon_renet2::renet2::{ConnectionConfig, RenetClient}; +#[cfg(not(target_arch = "wasm32"))] use std::net::{IpAddr, SocketAddr, UdpSocket}; -use std::time::SystemTime; +use web_time::SystemTime; pub struct ClientPlugin { #[cfg(target_arch = "wasm32")] @@ -30,8 +31,9 @@ pub struct ClientPlugin { pub server: SocketAddr, } impl Plugin for ClientPlugin { + #[allow(clippy::clone_on_copy)] fn build(&self, app: &mut App) { - let server = self.server; + let server = self.server.clone(); app.insert_resource(CursorWorldCoordinates(None)) .add_systems( Startup, @@ -39,7 +41,6 @@ impl Plugin for ClientPlugin { let current_time = SystemTime::now() .duration_since(SystemTime::UNIX_EPOCH) .unwrap(); - let client_id = current_time.as_millis() as u64; #[cfg(target_arch = "wasm32")] { @@ -61,7 +62,7 @@ impl Plugin for ClientPlugin { user_data: None, protocol_id: 0, }; - let mut transport = + let transport = NetcodeClientTransport::new(current_time, authentication, socket) .unwrap(); commands.insert_resource(client); @@ -122,6 +123,7 @@ fn find_me( for (entity, player) in q_clients.iter() { let this_id_clientside = entity_map.to_client().get(&player.client).unwrap(); if *this_id_clientside == entity { + info!("hi! i've been found!"); commands.entity(entity).insert(Me); } } diff --git a/crates/unified/src/client_plugins.rs b/crates/unified/src/client_plugins.rs index c673a615b50c4ae5bb5e747675a218fd2d7e9388..0455621d6eceeba0e482ee6ab0a01af96a8a9743 100644 --- a/crates/unified/src/client_plugins.rs +++ b/crates/unified/src/client_plugins.rs @@ -4,6 +4,7 @@ use bevy::app::{PluginGroup, PluginGroupBuilder}; use bevy::log::LogPlugin; use bevy_replicon::RepliconPlugins; use bevy_replicon_renet2::RepliconRenetClientPlugin; +#[cfg(not(target_arch = "wasm32"))] use std::net::SocketAddr; pub struct ClientPluginGroup { diff --git a/crates/unified/src/lib.rs b/crates/unified/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..b96463e32ff90b8fdf5573fc548f6c64247e065d --- /dev/null +++ b/crates/unified/src/lib.rs @@ -0,0 +1,15 @@ +//! Primary entrypoint for the lib... mostly useful for wasm +#[cfg(target_arch = "wasm32")] +pub mod wasm_entrypoint; +#[cfg(target_arch = "wasm32")] +pub use wasm_entrypoint::*; + +pub mod client; +pub mod client_plugins; +pub mod config; +pub mod ecs; +#[cfg(not(target_arch = "wasm32"))] +pub mod server; +#[cfg(not(target_arch = "wasm32"))] +pub mod server_plugins; +pub mod shared_plugins; \ No newline at end of file diff --git a/crates/unified/src/main.rs b/crates/unified/src/main.rs index 8e01f5457ac5463b44078e98e676c2fd422166ee..9798ba64dd982b7406493e3dbccd0b6bb639f459 100644 --- a/crates/unified/src/main.rs +++ b/crates/unified/src/main.rs @@ -1,14 +1,8 @@ -pub mod client; -pub mod client_plugins; -pub mod config; -pub mod ecs; -pub mod server; -pub mod server_plugins; -pub mod shared_plugins; -use crate::client_plugins::ClientPluginGroup; -use crate::server_plugins::ServerPluginGroup; -use crate::shared_plugins::SharedPluginGroup; +use starkingdoms::client_plugins::ClientPluginGroup; +#[cfg(not(target_arch = "wasm32"))] +use starkingdoms::server_plugins::ServerPluginGroup; +use starkingdoms::shared_plugins::SharedPluginGroup; use bevy::log::{Level, tracing_subscriber}; use bevy::prelude::*; use clap::Parser; @@ -28,6 +22,7 @@ enum Cli { #[arg(short, long)] server: SocketAddr, }, + #[cfg(not(target_arch = "wasm32"))] Server { #[arg(short = 'w', long)] bind_ws: SocketAddr, @@ -49,12 +44,6 @@ fn main() -> AppExit { EnvFilter::builder() .with_default_directive(Level::INFO.into()) .from_env_lossy() - .add_directive("bevy_app::plugin_group=error".parse().unwrap()) - .add_directive("bevy_app::app=error".parse().unwrap()) - .add_directive("bevy_replicon=warn".parse().unwrap()) - .add_directive("bevy_replicon_renet2=warn".parse().unwrap()) - .add_directive("naga=warn".parse().unwrap()) - .add_directive("wgpu_hal::vulkan=error".parse().unwrap()), ) .finish() .init(); @@ -63,6 +52,7 @@ fn main() -> AppExit { Cli::Client { server } => { app.add_plugins(ClientPluginGroup { server }); } + #[cfg(not(target_arch = "wasm32"))] Cli::Server { bind_ws, bind_native, diff --git a/crates/unified/src/server/mod.rs b/crates/unified/src/server/mod.rs index 42bde803782d4bc9f3bfa8c6b5dd8267a4ee7fea..fbc7ababaf1b2a464113f784d2bbf74883e9bac8 100644 --- a/crates/unified/src/server/mod.rs +++ b/crates/unified/src/server/mod.rs @@ -5,11 +5,9 @@ mod world_config; use bevy::prelude::*; use bevy_replicon::prelude::RepliconChannels; -use bevy_replicon_renet2::netcode::{ - BoxedSocket, NetcodeServerTransport, ServerAuthentication, ServerSetupConfig, -}; +use bevy_replicon_renet2::netcode::{BoxedSocket, NetcodeServerTransport, ServerAuthentication, ServerSetupConfig, ServerSocket}; use std::net::{SocketAddr, UdpSocket}; -use std::time::{SystemTime, UNIX_EPOCH}; +use web_time::{SystemTime, UNIX_EPOCH}; #[cfg(not(target_arch = "wasm32"))] use bevy_replicon_renet2::netcode::{ @@ -22,6 +20,12 @@ use crate::server::player::player_management_plugin; use crate::server::world_config::world_config_plugin; use bevy_replicon_renet2::RenetChannelsExt; use bevy_replicon_renet2::renet2::{ConnectionConfig, RenetServer}; +use tokio::runtime::Runtime; + +#[derive(Resource)] +pub struct RtResource { + rt: Runtime +} pub struct ServerPlugin { pub bind_ws: SocketAddr, @@ -43,15 +47,6 @@ impl Plugin for ServerPlugin { channels.client_configs(), )); - #[cfg(not(target_arch = "wasm32"))] - { - let server_config = ServerSetupConfig { - current_time: SystemTime::now().duration_since(UNIX_EPOCH).unwrap(), - max_clients, - protocol_id: 0, - authentication: ServerAuthentication::Unsecure, - socket_addresses: vec![vec![bind_native], vec![bind_ws]], - }; let rt = tokio::runtime::Runtime::new().unwrap(); @@ -68,6 +63,17 @@ impl Plugin for ServerPlugin { let native_socket = NativeSocket::new(UdpSocket::bind(bind_native).unwrap()).unwrap(); + let server_config = ServerSetupConfig { + current_time: SystemTime::now().duration_since(UNIX_EPOCH).unwrap(), + max_clients, + protocol_id: 0, + authentication: ServerAuthentication::Unsecure, + socket_addresses: vec![ + vec![native_socket.addr().unwrap()], + vec![ws_server.addr().unwrap()], + ], + }; + let transport = NetcodeServerTransport::new_with_sockets( server_config, vec![BoxedSocket::new(native_socket), BoxedSocket::new(ws_server)], @@ -76,9 +82,12 @@ impl Plugin for ServerPlugin { commands.insert_resource(server); commands.insert_resource(transport); + commands.insert_resource(RtResource { + rt + }); info!("websocket/native server listening"); - } + }, ) .add_plugins(planets_plugin) diff --git a/crates/unified/src/wasm_entrypoint.rs b/crates/unified/src/wasm_entrypoint.rs new file mode 100644 index 0000000000000000000000000000000000000000..4a953b7413e9dfc78eaac1a1de16351df705b7a2 --- /dev/null +++ b/crates/unified/src/wasm_entrypoint.rs @@ -0,0 +1,24 @@ +use bevy::app::App; +use url::Url; +use wasm_bindgen::prelude::*; +use crate::client_plugins::ClientPluginGroup; +use crate::shared_plugins::SharedPluginGroup; + +#[wasm_bindgen] +pub fn play(server: &str) -> Result<(), JsValue> { + console_error_panic_hook::set_once(); + tracing_wasm::set_as_global_default(); + + let u = Url::parse(server).map_err(|e| JsValue::from(e.to_string()))?; + + let mut app = App::new(); + app.add_plugins(ClientPluginGroup { + server: u.clone(), + }); + app.add_plugins(SharedPluginGroup); + app.run(); + + bevy::prelude::info!("goodbye!"); + + Ok(()) +} \ No newline at end of file diff --git a/crates/xtask/src/main.rs b/crates/xtask/src/main.rs index b59a0ff0ee3c7c48c549dcf79586242442bc6440..e03f65d15ec83c2dab32d68b3b2684493be51cc2 100644 --- a/crates/xtask/src/main.rs +++ b/crates/xtask/src/main.rs @@ -4,7 +4,7 @@ use std::env::{args, var}; use std::fs; use std::io::{Cursor, stdout, Write}; use std::path::{Path, PathBuf}; -use std::process::exit; +use std::process::{exit, Command}; use std::sync::mpsc; use std::sync::mpsc::TryRecvError; use std::thread::sleep; @@ -241,6 +241,25 @@ fn main() { println!(" {} {}.png {} {}", "-->".dimmed(), filename.to_string_lossy(), "✓ success".green(), format!("{}ms", start.elapsed().as_millis()).dimmed()); } }, + "unified:web" => { + let start = Instant::now(); + let target = workspace_dir().join("target/"); + let unified = workspace_dir().join("crates/unified/"); + exec("cargo", "build --package starkingdoms --lib --target wasm32-unknown-unknown -F wasm --no-default-features"); + let wasm_file = target.join("wasm32-unknown-unknown/debug/starkingdoms.wasm"); + exec("wasm-bindgen", format!("--target web --typescript --out-dir {} {}", unified.join("web/").display(), wasm_file.display()).as_str()); + println!("{} {} {}", "-->".dimmed(), "✓ done".green(), format!("{}ms", start.elapsed().as_millis()).dimmed()); + }, _ => panic!("unsupported command"), } } + +fn exec(program: &str, args: &str) { + println!("[{}] {} {}", "+".blue(), program, args); + Command::new(program) + .args(args.split(" ").collect::>()) + .spawn() + .unwrap() + .wait() + .unwrap(); +}