worker_sys/ext/
websocket.rs

1use wasm_bindgen::prelude::*;
2
3mod glue {
4    use super::*;
5
6    #[wasm_bindgen]
7    extern "C" {
8        #[wasm_bindgen]
9        pub type WebSocket;
10
11        #[wasm_bindgen(method, catch)]
12        pub fn accept(this: &WebSocket) -> Result<(), JsValue>;
13
14        #[wasm_bindgen(method, catch, js_name = "serializeAttachment")]
15        pub fn serialize_attachment(this: &WebSocket, value: JsValue) -> Result<(), JsValue>;
16
17        #[wasm_bindgen(method, catch, js_name = "deserializeAttachment")]
18        pub fn deserialize_attachment(this: &WebSocket) -> Result<JsValue, JsValue>;
19    }
20}
21
22pub trait WebSocketExt {
23    /// Accepts the server side of the WebSocket.
24    ///
25    /// [CF Documentation](https://developers.cloudflare.com/workers/runtime-apis/websockets#accept)
26    fn accept(&self) -> Result<(), JsValue>;
27
28    fn serialize_attachment(&self, value: JsValue) -> Result<(), JsValue>;
29
30    fn deserialize_attachment(&self) -> Result<JsValue, JsValue>;
31}
32
33impl WebSocketExt for web_sys::WebSocket {
34    fn accept(&self) -> Result<(), JsValue> {
35        self.unchecked_ref::<glue::WebSocket>().accept()
36    }
37
38    fn serialize_attachment(&self, value: JsValue) -> Result<(), JsValue> {
39        self.unchecked_ref::<glue::WebSocket>()
40            .serialize_attachment(value)
41    }
42
43    fn deserialize_attachment(&self) -> Result<JsValue, JsValue> {
44        self.unchecked_ref::<glue::WebSocket>()
45            .deserialize_attachment()
46    }
47}