diff --git a/examples/basic.rs b/examples/basic.rs index ea1c387c279607511b198700b6d9744e0898ff94..5d4683bfbde8fe9e1dc7d474c0cdc14fe806d2a5 100644 --- a/examples/basic.rs +++ b/examples/basic.rs @@ -15,18 +15,16 @@ fn main() -> Result<(), JsValue> { client.set_on_error(Some(Box::new(|e| { error!("{:#?}", e); }))); - client.set_on_connection(Some(Box::new( - |c: Rc<RefCell<wasm_sockets::EventClient>>, e| { - info!("Connected: {:#?}", e); - info!("{:#?}", &c.borrow_mut().status); - info!("Sending message..."); - c.borrow().send_string("test...").unwrap(); - c.borrow().send_binary(vec![20]).unwrap(); - }, - ))); + client.set_on_connection(Some(Box::new(|c: &wasm_sockets::EventClient, e| { + info!("Connected: {:#?}", e); + info!("{:#?}", c.status); + info!("Sending message..."); + c.send_string("test...").unwrap(); + c.send_binary(vec![20]).unwrap(); + }))); client.set_on_message(Some(Box::new( - |c: Rc<RefCell<wasm_sockets::EventClient>>, e: wasm_sockets::Message| { + |c: &wasm_sockets::EventClient, e: wasm_sockets::Message| { info!("New Message: {:#?}", e); }, ))); diff --git a/src/lib.rs b/src/lib.rs index be07c61f5c7dd9e9f22c64ec37b97692fc13ce75..2168f58e716dcfe445b51266cacca7b3c158b80f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -128,8 +128,8 @@ pub struct EventClient { pub connection: Rc<RefCell<web_sys::WebSocket>>, pub status: Rc<RefCell<ConnectionStatus>>, pub on_error: Rc<RefCell<Option<Box<dyn Fn(ErrorEvent) -> ()>>>>, - pub on_connection: Rc<RefCell<Option<Box<dyn Fn(Rc<RefCell<EventClient>>, JsValue) -> ()>>>>, - pub on_message: Rc<RefCell<Option<Box<dyn Fn(Rc<RefCell<EventClient>>, Message) -> ()>>>>, + pub on_connection: Rc<RefCell<Option<Box<dyn Fn(&EventClient, JsValue) -> ()>>>>, + pub on_message: Rc<RefCell<Option<Box<dyn Fn(&EventClient, Message) -> ()>>>>, } impl EventClient { pub fn new(url: &str) -> Result<Self, JsValue> { @@ -154,12 +154,11 @@ impl EventClient { ws.set_onerror(Some(onerror_callback.as_ref().unchecked_ref())); onerror_callback.forget(); - let on_connection: Rc< - RefCell<Option<Box<dyn Fn(Rc<RefCell<EventClient>>, JsValue) -> ()>>>, - > = Rc::new(RefCell::new(None)); + let on_connection: Rc<RefCell<Option<Box<dyn Fn(&EventClient, JsValue) -> ()>>>> = + Rc::new(RefCell::new(None)); let on_connection_ref = on_connection.clone(); - let on_message: Rc<RefCell<Option<Box<dyn Fn(Rc<RefCell<EventClient>>, Message) -> ()>>>> = + let on_message: Rc<RefCell<Option<Box<dyn Fn(&EventClient, Message) -> ()>>>> = Rc::new(RefCell::new(None)); let on_message_ref = on_message.clone(); @@ -181,7 +180,7 @@ impl EventClient { let onopen_callback = Closure::wrap(Box::new(move |v| { *ref_status.borrow_mut() = ConnectionStatus::Connected; if let Some(f) = &*on_connection_ref.borrow() { - f.as_ref()(client_ref.clone(), v); + f.as_ref()(&*client_ref.clone().borrow(), v); } }) as Box<dyn FnMut(JsValue)>); connection @@ -200,7 +199,7 @@ impl EventClient { // Convert arraybuffer to vec let array = js_sys::Uint8Array::new(&abuf).to_vec(); if let Some(f) = &*on_message_ref.borrow() { - f.as_ref()(client_ref.clone(), Message::Binary(array)); + f.as_ref()(&*client_ref.clone().borrow(), Message::Binary(array)); } } else if let Ok(blob) = e.data().dyn_into::<web_sys::Blob>() { // Received blob data @@ -213,7 +212,7 @@ impl EventClient { let onloadend_cb = Closure::wrap(Box::new(move |_e: web_sys::ProgressEvent| { let array = js_sys::Uint8Array::new(&fr_c.result().unwrap()).to_vec(); if let Some(f) = &*cbref.borrow() { - f.as_ref()(cbfref.clone(), Message::Binary(array)); + f.as_ref()(&*cbfref.clone().borrow(), Message::Binary(array)); } }) as Box<dyn FnMut(web_sys::ProgressEvent)>); @@ -222,7 +221,7 @@ impl EventClient { onloadend_cb.forget(); } else if let Ok(txt) = e.data().dyn_into::<js_sys::JsString>() { if let Some(f) = &*on_message_ref.borrow() { - f.as_ref()(client_ref.clone(), Message::Text(txt.into())); + f.as_ref()(&*client_ref.clone().borrow(), Message::Text(txt.into())); } } else { // Got unknown data @@ -249,17 +248,11 @@ impl EventClient { pub fn set_on_error(&mut self, f: Option<Box<dyn Fn(ErrorEvent) -> ()>>) { *self.on_error.borrow_mut() = f; } - pub fn set_on_connection( - &mut self, - f: Option<Box<dyn Fn(Rc<RefCell<EventClient>>, JsValue) -> ()>>, - ) { + pub fn set_on_connection(&mut self, f: Option<Box<dyn Fn(&EventClient, JsValue) -> ()>>) { *self.on_connection.borrow_mut() = f; } - pub fn set_on_message( - &mut self, - f: Option<Box<dyn Fn(Rc<RefCell<EventClient>>, Message) -> ()>>, - ) { + pub fn set_on_message(&mut self, f: Option<Box<dyn Fn(&EventClient, Message) -> ()>>) { *self.on_message.borrow_mut() = f; }