Skip to content

Commit 27357f4

Browse files
committed
better wasm implementation
1 parent 4ade682 commit 27357f4

File tree

4 files changed

+270
-178
lines changed

4 files changed

+270
-178
lines changed

Cargo.toml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ rustdoc-args = ["--cfg", "docsrs"]
2323
json = ["dep:serde", "dep:serde_json"]
2424

2525
[dependencies]
26-
futures-util = { version = "0.3", default-features = false, features = ["sink"] }
26+
futures-util = { version = "0.3", default-features = false, features = ["sink", "std", "async-await-macro"] }
27+
futures-channel = { version = "0.3", default-features = false, features = ["sink", "std"] }
2728
reqwest = { version = "0.12", default-features = false }
2829
thiserror = "1"
2930
tracing = "0.1"
@@ -37,14 +38,12 @@ tungstenite = { version = "0.23", default-features = false, features = ["handsha
3738

3839
[target.'cfg(target_arch = "wasm32")'.dependencies]
3940
web-sys = { version = "0.3", features = ["WebSocket", "CloseEvent", "ErrorEvent", "Event", "MessageEvent", "BinaryType"] }
40-
tokio = { version = "1", default-features = false, features = ["sync", "macros"] }
41+
wasm-bindgen-futures = "0.4"
4142

4243
[dev-dependencies]
4344
tokio = { version = "1", features = ["macros", "rt"] }
4445
reqwest = { version = "0.12", features = ["default-tls"] }
4546
serde = { version = "1.0", features = ["derive"] }
46-
futures-util = { version = "0.3", default-features = false, features = ["sink", "alloc"] }
4747

4848
[target.'cfg(target_arch = "wasm32")'.dev-dependencies]
4949
wasm-bindgen-test = "0.3"
50-
wasm-bindgen-futures = "0.4"

examples/wasm/src/app.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ pub fn App() -> impl IntoView {
1717

1818
spawn_local(async move {
1919
let websocket = reqwest_websocket::websocket("https://echo.websocket.org/").await.unwrap();
20+
tracing::info!("WebSocket connected");
21+
2022
let (mut sender, mut receiver) = websocket.split();
2123

2224
futures::join!(

src/lib.rs

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ pub enum Error {
8585
#[cfg(target_arch = "wasm32")]
8686
#[cfg_attr(docsrs, doc(cfg(target_arch = "wasm32")))]
8787
#[error("web_sys error")]
88-
WebSys(#[from] wasm::WebSysError),
88+
WebSys(#[from] wasm::Error),
8989

9090
/// Error during serialization/deserialization.
9191
#[error("serde_json error")]
@@ -160,7 +160,7 @@ impl UpgradedRequestBuilder {
160160
let inner = native::send_request(self.inner).await?;
161161

162162
#[cfg(target_arch = "wasm32")]
163-
let inner = wasm::WebSysWebSocketStream::new(self.inner.build()?, &self.protocols).await?;
163+
let inner = wasm::WebSocket::new(self.inner.build()?, &self.protocols).await?;
164164

165165
Ok(UpgradeResponse {
166166
inner,
@@ -178,7 +178,7 @@ pub struct UpgradeResponse {
178178
inner: native::WebSocketResponse,
179179

180180
#[cfg(target_arch = "wasm32")]
181-
inner: wasm::WebSysWebSocketStream,
181+
inner: wasm::WebSocket,
182182

183183
#[allow(dead_code)]
184184
protocols: Vec<String>,
@@ -202,7 +202,7 @@ impl UpgradeResponse {
202202

203203
#[cfg(target_arch = "wasm32")]
204204
let (inner, protocol) = {
205-
let protocol = self.inner.protocol();
205+
let protocol = self.inner.protocol().to_owned();
206206
(self.inner, Some(protocol))
207207
};
208208

@@ -225,7 +225,7 @@ pub struct WebSocket {
225225
inner: native::WebSocketStream,
226226

227227
#[cfg(target_arch = "wasm32")]
228-
inner: wasm::WebSysWebSocketStream,
228+
inner: wasm::WebSocket,
229229

230230
protocol: Option<String>,
231231
}
@@ -256,7 +256,15 @@ impl WebSocket {
256256
}
257257

258258
#[cfg(target_arch = "wasm32")]
259-
self.inner.close(code.into(), reason.unwrap_or_default())?;
259+
{
260+
let mut inner = self.inner;
261+
inner
262+
.send(Message::Close {
263+
code,
264+
reason: reason.unwrap_or_default().to_owned(),
265+
})
266+
.await?;
267+
}
260268

261269
Ok(())
262270
}
@@ -319,6 +327,18 @@ pub mod tests {
319327

320328
use super::{websocket, CloseCode, Message, RequestBuilderExt, WebSocket};
321329

330+
macro_rules! assert_send {
331+
($ty:ty) => {
332+
const _: () = {
333+
struct Assert<T: Send>(std::marker::PhantomData<T>);
334+
Assert::<$ty>(std::marker::PhantomData);
335+
};
336+
};
337+
}
338+
339+
// unfortunately hyper IO is not sync
340+
assert_send!(WebSocket);
341+
322342
async fn test_websocket(mut websocket: WebSocket) {
323343
let text = "Hello, World!";
324344
websocket

0 commit comments

Comments
 (0)