Skip to content
Snippets Groups Projects
Verified Commit fb674be4 authored by Louis's avatar Louis :fire:
Browse files

Handle disconnect for web target

parent 1f6e35cb
No related branches found
No related tags found
No related merge requests found
......@@ -19,4 +19,4 @@ features = []
websocket = { version = "0.26.5" , default-features = false, features = ["sync", "sync-ssl", "bytes", "native-tls"]}
[target.'cfg(target_arch = "wasm32")'.dependencies]
wasm-sockets = "0.2.2"
wasm-sockets = { git = "https://lab.lcr.gr/microhacks/wasm-sockets.git", rev = "5c8bdb2a54c1acfd816587bfcd5f64a34b3740b4" }
......@@ -15,7 +15,10 @@ This library is quite immature; many features still need to be added for it to b
- [x] WS Connection from wasm
- [x] Frame independent event buffering
- [x] User initiated disconnect on desktop
- [ ] User initiated disconnect on wasm
- [x] User initiated disconnect on wasm
- [x] Handle remote disconnect
- [ ] Emit events for non-user-initiated lifecycle events
- [ ] Correctly track status of underlying connection
- [ ] Automatic reconnection
- [x] Map received events to user defined types
- [x] Send events of a user defined type
......
use std::fmt::Debug;
use std::marker::PhantomData;
use std::ops::Deref;
use std::sync::{Arc, Mutex};
use bevy::ecs::event::Events;
......@@ -9,7 +10,7 @@ use bevy::prelude::{
IntoExclusiveSystem, NonSendMut, Plugin, ResMut, World,
};
use thiserror::Error;
use wasm_sockets::Message;
use wasm_sockets::{EventClient, Message};
use crate::events::{FromSocketMessage, SocketControlEvent, SocketState, ToSocketMessage};
......@@ -34,6 +35,21 @@ where
client: wasm_sockets::PollingClient,
}
pub trait ClosableExt {
fn close(&mut self);
}
impl<SentMessageType, ReceivedMessageType> Drop
for RemoteEventDispatcher<SentMessageType, ReceivedMessageType>
where
ReceivedMessageType: FromSocketMessage + Send + Sync + 'static,
SentMessageType: ToSocketMessage + Send + Sync + 'static,
{
fn drop(&mut self) {
self.client.close();
}
}
fn connect_to<SentMessageType, ReceivedMessageType, T: ToString>(
remote_host: T,
) -> crate::events::RemoteEventResult<RemoteEventDispatcher<SentMessageType, ReceivedMessageType>>
......@@ -61,6 +77,7 @@ where
)> = SystemState::new(&mut world);
let mut client_to_insert = None;
let mut remove_client = false;
{
let (mut maybe_client, mut reader): (
......@@ -68,6 +85,18 @@ where
EventReader<SocketControlEvent>,
) = state.get_mut(&mut world);
if let Some(ref client) = maybe_client {
if client.client.status.borrow().deref()
== &wasm_sockets::ConnectionStatus::Disconnected
{
#[rustfmt::skip]
// rustfmt breaks the ending "();" to put ");" on its own line...
let it = world.remove_non_send_resource::<RemoteEventDispatcher<SentMessageType, ReceivedMessageType>>();
drop(it);
return;
}
}
for event in reader.iter() {
match event {
SocketControlEvent::Create(url) => {
......@@ -90,7 +119,7 @@ where
}
SocketControlEvent::Disconnect => match maybe_client {
Some(ref client) => {
log::warn!("NOT IMPLEMENTED: Disconnect");
remove_client = true;
}
None => {
log::warn!("There was no connection to disconnect from");
......@@ -100,6 +129,13 @@ where
}
};
if remove_client {
#[rustfmt::skip]
// rustfmt breaks the ending "();" to put ");" on its own line...
let it = world.remove_non_send_resource::<RemoteEventDispatcher<SentMessageType, ReceivedMessageType>>();
drop(it);
}
if let Some(new_client) = client_to_insert {
world.insert_non_send_resource(new_client);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment