diff --git a/extensions/websocket/01_websocket.js b/extensions/websocket/01_websocket.js index c77af4566a..9fc608958b 100644 --- a/extensions/websocket/01_websocket.js +++ b/extensions/websocket/01_websocket.js @@ -118,44 +118,32 @@ url: wsURL.href, protocols: protocols.join(", "), }).then((create) => { - if (create.success) { - this.#rid = create.rid; - this.#extensions = create.extensions; - this.#protocol = create.protocol; + this.#rid = create.rid; + this.#extensions = create.extensions; + this.#protocol = create.protocol; - if (this.#readyState === CLOSING) { - core.opAsync("op_ws_close", { - rid: this.#rid, - }).then(() => { - this.#readyState = CLOSED; + if (this.#readyState === CLOSING) { + core.opAsync("op_ws_close", { + rid: this.#rid, + }).then(() => { + this.#readyState = CLOSED; - const errEvent = new ErrorEvent("error"); - errEvent.target = this; - this.dispatchEvent(errEvent); + const errEvent = new ErrorEvent("error"); + errEvent.target = this; + this.dispatchEvent(errEvent); - const event = new CloseEvent("close"); - event.target = this; - this.dispatchEvent(event); - tryClose(this.#rid); - }); - } else { - this.#readyState = OPEN; - const event = new Event("open"); + const event = new CloseEvent("close"); event.target = this; this.dispatchEvent(event); - - this.#eventLoop(); - } + tryClose(this.#rid); + }); } else { - this.#readyState = CLOSED; + this.#readyState = OPEN; + const event = new Event("open"); + event.target = this; + this.dispatchEvent(event); - const errEvent = new ErrorEvent("error"); - errEvent.target = this; - this.dispatchEvent(errEvent); - - const closeEvent = new CloseEvent("close"); - closeEvent.target = this; - this.dispatchEvent(closeEvent); + this.#eventLoop(); } }).catch((err) => { this.#readyState = CLOSED; @@ -362,7 +350,9 @@ case "error": { this.#readyState = CLOSED; - const errorEv = new ErrorEvent("error"); + const errorEv = new ErrorEvent("error", { + message: value, + }); errorEv.target = this; this.dispatchEvent(errorEv); diff --git a/extensions/websocket/lib.rs b/extensions/websocket/lib.rs index 8dfa26c478..0da8d49116 100644 --- a/extensions/websocket/lib.rs +++ b/extensions/websocket/lib.rs @@ -35,7 +35,6 @@ use std::rc::Rc; use std::sync::Arc; use tokio::net::TcpStream; use tokio_rustls::{rustls::ClientConfig, TlsConnector}; -use tokio_tungstenite::tungstenite::Error as TungsteniteError; use tokio_tungstenite::tungstenite::{ handshake::client::Response, protocol::frame::coding::CloseCode, protocol::CloseFrame, Message, @@ -110,10 +109,9 @@ pub struct CreateArgs { #[derive(Serialize)] #[serde(rename_all = "camelCase")] pub struct CreateResponse { - success: bool, - rid: Option, - protocol: Option, - extensions: Option, + rid: ResourceId, + protocol: String, + extensions: String, } pub async fn op_ws_create( @@ -152,18 +150,7 @@ where _ => unreachable!(), }); let addr = format!("{}:{}", domain, port); - let try_socket = TcpStream::connect(addr).await; - let tcp_socket = match try_socket.map_err(TungsteniteError::Io) { - Ok(socket) => socket, - Err(_) => { - return Ok(CreateResponse { - success: false, - rid: None, - protocol: None, - extensions: None, - }) - } - }; + let tcp_socket = TcpStream::connect(addr).await?; let socket: MaybeTlsStream = match uri.scheme_str() { Some("ws") => MaybeTlsStream::Plain(tcp_socket), @@ -215,10 +202,9 @@ where .map(|header| header.to_str().unwrap()) .collect::(); Ok(CreateResponse { - success: true, - rid: Some(rid), - protocol: Some(protocol.to_string()), - extensions: Some(extensions), + rid, + protocol: protocol.to_string(), + extensions, }) } @@ -293,7 +279,7 @@ pub enum NextEventResponse { Close { code: u16, reason: String }, Ping, Pong, - Error, + Error(String), Closed, } @@ -324,7 +310,7 @@ pub async fn op_ws_next_event( }, Some(Ok(Message::Ping(_))) => NextEventResponse::Ping, Some(Ok(Message::Pong(_))) => NextEventResponse::Pong, - Some(Err(_)) => NextEventResponse::Error, + Some(Err(e)) => NextEventResponse::Error(e.to_string()), None => { state.borrow_mut().resource_table.close(rid).unwrap(); NextEventResponse::Closed