use wasm_bindgen::prelude::*;
#[wasm_bindgen]
extern "C" {
pub type WebSocketPair;
#[wasm_bindgen(constructor)]
pub fn new() -> WebSocketPair;
#[wasm_bindgen(method, getter, js_name = "0")]
pub fn client(this: &WebSocketPair) -> WebSocket;
#[wasm_bindgen(method, getter, js_name = "1")]
pub fn server(this: &WebSocketPair) -> WebSocket;
}
#[wasm_bindgen]
extern "C" {
#[derive(Clone)]
pub type WebSocket;
#[wasm_bindgen(method)]
pub fn accept(this: &WebSocket);
#[wasm_bindgen(method, catch)]
pub fn send(this: &WebSocket, data: &JsValue) -> Result<(), JsValue>;
#[wasm_bindgen(method)]
pub fn close(this: &WebSocket, code: Option<u16>, reason: Option<&str>);
#[wasm_bindgen(method, js_name = addEventListener)]
pub fn add_event_listener(this: &WebSocket, event: &str, handler: &js_sys::Function);
#[wasm_bindgen(method, js_name = removeEventListener)]
pub fn remove_event_listener(this: &WebSocket, event: &str, handler: &js_sys::Function);
}
#[wasm_bindgen]
extern "C" {
pub type MessageEvent;
#[wasm_bindgen(method, getter)]
pub fn data(this: &MessageEvent) -> JsValue;
}
#[wasm_bindgen]
extern "C" {
pub type CloseEvent;
#[wasm_bindgen(method, getter)]
pub fn code(this: &CloseEvent) -> u16;
#[wasm_bindgen(method, getter)]
pub fn reason(this: &CloseEvent) -> String;
#[wasm_bindgen(method, getter, js_name = wasClean)]
pub fn was_clean(this: &CloseEvent) -> bool;
}
#[wasm_bindgen]
extern "C" {
pub type ErrorEvent;
#[wasm_bindgen(method, getter)]
pub fn message(this: &ErrorEvent) -> String;
}
#[wasm_bindgen]
extern "C" {
#[wasm_bindgen(extends = js_sys::Object)]
#[derive(Clone, Debug)]
pub type ResponseInit;
}
impl ResponseInit {
pub fn new_websocket(status: u16, websocket: &WebSocket) -> Result<Self, JsValue> {
let init = js_sys::Object::new();
js_sys::Reflect::set(&init, &"status".into(), &status.into())?;
js_sys::Reflect::set(&init, &"webSocket".into(), websocket)?;
Ok(init.unchecked_into())
}
}
#[wasm_bindgen]
extern "C" {
#[wasm_bindgen(js_namespace = Response, js_name = "new", catch)]
fn response_new_with_init(
body: JsValue,
init: &ResponseInit,
) -> Result<web_sys::Response, JsValue>;
}
pub fn create_websocket_response(client: &WebSocket) -> Result<web_sys::Response, JsValue> {
let init = ResponseInit::new_websocket(101, client)?;
response_new_with_init(JsValue::NULL, &init)
}