Skip to content

Commit

Permalink
Merge pull request #352 from cBournhonesque/cb/fix-web
Browse files Browse the repository at this point in the history
Use wasm_bindgen_futures::spawn_local instead of BevyIoTaskPool in wasm
  • Loading branch information
cBournhonesque authored May 14, 2024
2 parents 7da67eb + b8743ae commit 1475df6
Show file tree
Hide file tree
Showing 24 changed files with 63 additions and 50 deletions.
1 change: 1 addition & 0 deletions examples/auth/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<title>Bevy game</title>
<link data-trunk rel="rust"/>
</head>
</html>
1 change: 1 addition & 0 deletions examples/bullet_prespawn/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<title>Bevy game</title>
<link data-trunk rel="rust"/>
</head>
</html>
1 change: 1 addition & 0 deletions examples/client_replication/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<title>Bevy game</title>
<link data-trunk rel="rust"/>
</head>
</html>
7 changes: 4 additions & 3 deletions examples/common/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ description = "Common harness for the lightyear examples"

[dependencies]
lightyear = { path = "../../lightyear", features = [
"steam",
"webtransport",
"websocket",
"steam",
"webtransport",
"websocket",
] }

# utils
Expand All @@ -17,6 +17,7 @@ async-compat = "0.2.3"
cfg-if = "1.0.0"
clap = { version = "4.5.4", features = ["derive"] }
crossbeam-channel = "0.5.12"
rand = "0.8.5"
serde = { version = "1.0.201", features = ["derive"] }


Expand Down
7 changes: 5 additions & 2 deletions examples/common/src/settings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@
#![allow(unused_variables)]
use std::net::{Ipv4Addr, SocketAddr};

use async_compat::Compat;
use bevy::asset::ron;
use bevy::prelude::Resource;
use bevy::tasks::IoTaskPool;
use bevy::utils::Duration;
use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize};

#[cfg(not(target_family = "wasm"))]
use async_compat::Compat;
#[cfg(not(target_family = "wasm"))]
use bevy::tasks::IoTaskPool;

use lightyear::prelude::client::Authentication;
#[cfg(not(target_family = "wasm"))]
use lightyear::prelude::client::SteamConfig;
Expand Down
1 change: 1 addition & 0 deletions examples/interest_management/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<title>Bevy game</title>
<link data-trunk rel="rust"/>
</head>
</html>
1 change: 1 addition & 0 deletions examples/leafwing_inputs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<title>Bevy game</title>
<link data-trunk rel="rust"/>
</head>
</html>
1 change: 1 addition & 0 deletions examples/lobby/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<title>Bevy game</title>
<link data-trunk rel="rust"/>
</head>
</html>
1 change: 1 addition & 0 deletions examples/priority/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<title>Bevy game</title>
<link data-trunk rel="rust"/>
</head>
</html>
1 change: 1 addition & 0 deletions examples/replication_groups/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<title>Bevy game</title>
<link data-trunk rel="rust"/>
</head>
</html>
1 change: 1 addition & 0 deletions examples/simple_box/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<title>Bevy game</title>
<link data-trunk rel="rust"/>
</head>
</html>
2 changes: 1 addition & 1 deletion lightyear/src/client/io/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ impl ClientTransport {
client_addr,
server_addr,
certificate_digest,
} => TransportBuilderEnum::WebTransportClient(WebTransportClientSocketBuilder {
} => ClientTransportBuilderEnum::WebTransportClient(WebTransportClientSocketBuilder {
client_addr,
server_addr,
certificate_digest,
Expand Down
2 changes: 1 addition & 1 deletion lightyear/src/client/io/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ impl Io {
self.state = IoState::Disconnected;
if let Some(event_sender) = self.context.event_sender.as_mut() {
event_sender
.send_blocking(ClientIoEvent::Disconnected(
.try_send(ClientIoEvent::Disconnected(
std::io::Error::other("client requested disconnection").into(),
))
.map_err(Error::from)?;
Expand Down
4 changes: 2 additions & 2 deletions lightyear/src/connection/netcode/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1016,7 +1016,7 @@ impl NetServer for Server {
if let Some(mut io) = self.io.take() {
if let Some(sender) = &mut self.server.cfg.context.sender {
sender
.send_blocking(ServerIoEvent::ServerDisconnected(
.try_send(ServerIoEvent::ServerDisconnected(
crate::transport::error::Error::UserRequest,
))
.context("Could not send 'ServerStopped' event to io")?;
Expand Down Expand Up @@ -1108,7 +1108,7 @@ impl Server {
if let Some(sender) = &mut ctx.sender {
debug!("Notify the io that client {id:?} got disconnected, so that we can stop the corresponding task");
let _ = sender
.send_blocking(ServerIoEvent::ClientDisconnected(addr))
.try_send(ServerIoEvent::ClientDisconnected(addr))
.inspect_err(|e| {
error!("Error sending 'ClientDisconnected' event to io: {:?}", e)
});
Expand Down
4 changes: 0 additions & 4 deletions lightyear/src/server/io/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ use crate::transport::middleware::compression::zstd::compression::ZstdCompressor
use crate::transport::middleware::compression::zstd::decompression::ZstdDecompressor;
use crate::transport::middleware::conditioner::LinkConditioner;
use crate::transport::middleware::{PacketReceiverWrapper, PacketSenderWrapper};
#[cfg(not(target_family = "wasm"))]
use crate::transport::udp::UdpSocketBuilder;
#[cfg(all(feature = "websocket", not(target_family = "wasm")))]
use crate::transport::websocket::server::WebSocketServerSocketBuilder;
Expand All @@ -28,7 +27,6 @@ use wtransport::Identity;
#[derive(Debug, TypePath)]
pub enum ServerTransport {
/// Use a [`UdpSocket`](std::net::UdpSocket)
#[cfg(not(target_family = "wasm"))]
UdpSocket(SocketAddr),
/// Use [`WebTransport`](https://wicg.github.io/web-transport/) as a transport layer
#[cfg(all(feature = "webtransport", not(target_family = "wasm")))]
Expand Down Expand Up @@ -58,7 +56,6 @@ impl Clone for ServerTransport {
#[inline]
fn clone(&self) -> ServerTransport {
match self {
#[cfg(not(target_family = "wasm"))]
ServerTransport::UdpSocket(__self_0) => {
ServerTransport::UdpSocket(Clone::clone(__self_0))
}
Expand Down Expand Up @@ -87,7 +84,6 @@ impl Clone for ServerTransport {
impl ServerTransport {
fn build(self) -> ServerTransportBuilderEnum {
match self {
#[cfg(not(target_family = "wasm"))]
ServerTransport::UdpSocket(addr) => {
ServerTransportBuilderEnum::UdpSocket(UdpSocketBuilder { local_addr: addr })
}
Expand Down
2 changes: 1 addition & 1 deletion lightyear/src/server/io/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ impl Io {
self.state = IoState::Disconnected;
if let Some(event_sender) = self.context.event_sender.as_mut() {
event_sender
.send_blocking(ServerIoEvent::ServerDisconnected(
.try_send(ServerIoEvent::ServerDisconnected(
std::io::Error::other("server requested disconnection").into(),
))
.map_err(Error::from)?;
Expand Down
3 changes: 0 additions & 3 deletions lightyear/src/server/io/transport.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ use crate::transport::channels::Channels;
use crate::transport::dummy::DummyIo;
use crate::transport::error::Result;
use crate::transport::io::IoState;
#[cfg(not(target_family = "wasm"))]
use crate::transport::udp::{UdpSocket, UdpSocketBuilder};
#[cfg(all(feature = "websocket", not(target_family = "wasm")))]
use crate::transport::websocket::server::{WebSocketServerSocket, WebSocketServerSocketBuilder};
Expand All @@ -29,7 +28,6 @@ pub(crate) trait ServerTransportBuilder: Send + Sync {

#[enum_dispatch(ServerTransportBuilder)]
pub(crate) enum ServerTransportBuilderEnum {
#[cfg(not(target_family = "wasm"))]
UdpSocket(UdpSocketBuilder),
#[cfg(all(feature = "webtransport", not(target_family = "wasm")))]
WebTransportServer(WebTransportServerSocketBuilder),
Expand All @@ -42,7 +40,6 @@ pub(crate) enum ServerTransportBuilderEnum {
#[allow(clippy::large_enum_variant)]
#[enum_dispatch(Transport)]
pub(crate) enum ServerTransportEnum {
#[cfg(not(target_family = "wasm"))]
UdpSocket(UdpSocket),
#[cfg(all(feature = "webtransport", not(target_family = "wasm")))]
WebTransportServer(WebTransportServerSocket),
Expand Down
1 change: 0 additions & 1 deletion lightyear/src/transport/dummy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ use crate::client::io::{ClientIoEventReceiver, ClientNetworkEventSender};
use crate::server::io::transport::{ServerTransportBuilder, ServerTransportEnum};
use crate::server::io::{ServerIoEventReceiver, ServerNetworkEventSender};
use crate::transport::io::IoState;
use crate::transport::udp::{UdpSocket, UdpSocketBuffer, UdpSocketBuilder};
use crate::transport::{
BoxedReceiver, BoxedSender, PacketReceiver, PacketSender, Transport, LOCAL_SOCKET, MTU,
};
Expand Down
8 changes: 8 additions & 0 deletions lightyear/src/transport/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,14 @@ impl<T> ::core::convert::From<async_channel::SendError<T>> for Error {
}
}

#[allow(unused_qualifications)]
impl<T> ::core::convert::From<async_channel::TrySendError<T>> for Error {
#[allow(deprecated)]
fn from(source: async_channel::TrySendError<T>) -> Self {
Error::Channel(source.to_string())
}
}

#[allow(unused_qualifications)]
impl<T> ::core::convert::From<crossbeam_channel::SendError<T>> for Error {
#[allow(deprecated)]
Expand Down
1 change: 0 additions & 1 deletion lightyear/src/transport/local.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ use crate::client::io::{ClientIoEventReceiver, ClientNetworkEventSender};
use crate::server::io::transport::{ServerTransportBuilder, ServerTransportEnum};
use crate::server::io::{ServerIoEventReceiver, ServerNetworkEventSender};
use crate::transport::io::IoState;
use crate::transport::udp::UdpSocketBuilder;
use crate::transport::{
BoxedReceiver, BoxedSender, PacketReceiver, PacketSender, Transport, LOCAL_SOCKET,
};
Expand Down
3 changes: 0 additions & 3 deletions lightyear/src/transport/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ use crate::transport::channels::Channels;
use crate::transport::dummy::DummyIo;
use crate::transport::io::IoState;
use crate::transport::local::{LocalChannel, LocalChannelBuilder};
#[cfg(not(target_family = "wasm"))]
use crate::transport::udp::{UdpSocket, UdpSocketBuilder};
#[cfg(feature = "websocket")]
use crate::transport::websocket::client::{WebSocketClientSocket, WebSocketClientSocketBuilder};
Expand All @@ -35,8 +34,6 @@ pub mod io;
pub(crate) mod local;

/// The transport is a UDP socket
#[cfg_attr(docsrs, doc(cfg(not(target_family = "wasm"))))]
#[cfg(not(target_family = "wasm"))]
pub(crate) mod udp;

/// The transport is a map of channels (used for server, during testing)
Expand Down
1 change: 1 addition & 0 deletions lightyear/src/transport/udp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ impl UdpSocketBuilder {
}
}

#[cfg(not(target_family = "wasm"))]
impl ClientTransportBuilder for UdpSocketBuilder {
fn connect(
self,
Expand Down
8 changes: 4 additions & 4 deletions lightyear/src/transport/websocket/client_wasm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ impl ClientTransportBuilder for WebSocketClientSocketBuilder {
)> {
let (serverbound_tx, serverbound_rx) = unbounded_channel::<Vec<u8>>();
let (clientbound_tx, clientbound_rx) = unbounded_channel::<Vec<u8>>();
let (close_tx, mut close_rx) = crossbeam_channel::bounded(1);
let (close_tx, close_rx) = async_channel::bounded(1);

let sender = WebSocketClientSocketSender { serverbound_tx };

Expand Down Expand Up @@ -83,7 +83,7 @@ impl ClientTransportBuilder for WebSocketClientSocketBuilder {
let on_open_callback = Closure::<dyn FnOnce()>::once(move || {
info!("WebSocket handshake has been successfully completed");
let serverbound_rx = serverbound_rx.clone();
IoTaskPool::get().spawn_local(async move {
wasm_bindgen_futures::spawn_local(async move {
while let Some(msg) = serverbound_rx.lock().await.recv().await {
if ws_clone.ready_state() != 1 {
warn!("Tried to send packet through closed websocket connection");
Expand All @@ -96,8 +96,8 @@ impl ClientTransportBuilder for WebSocketClientSocketBuilder {

let ws_clone = ws.clone();
let listen_close_signal_callback = Closure::<dyn FnOnce()>::once(move || {
IoTaskPool::get().spawn_local(async move {
close_rx.recv().await;
wasm_bindgen_futures::spawn_local(async move {
let _ = close_rx.recv().await;
info!("Close websocket connection");
ws_clone.close().unwrap();
});
Expand Down
Loading

0 comments on commit 1475df6

Please sign in to comment.