diff options
Diffstat (limited to 'ext/websocket/lib.rs')
-rw-r--r-- | ext/websocket/lib.rs | 66 |
1 files changed, 48 insertions, 18 deletions
diff --git a/ext/websocket/lib.rs b/ext/websocket/lib.rs index 704c699a7..337752c21 100644 --- a/ext/websocket/lib.rs +++ b/ext/websocket/lib.rs @@ -20,6 +20,7 @@ use deno_core::OpState; use deno_core::RcRef; use deno_core::Resource; use deno_core::ResourceId; +use deno_core::StringOrBuffer; use deno_core::ZeroCopyBuf; use deno_tls::create_client_config; use http::header::HeaderName; @@ -555,11 +556,23 @@ pub enum NextEventResponse { Closed, } -#[op] +#[repr(u32)] +enum NextEventKind { + String = 0, + Binary = 1, + Close = 2, + Ping = 3, + Pong = 4, + Error = 5, + Closed = 6, +} + +#[op(deferred)] pub async fn op_ws_next_event( state: Rc<RefCell<OpState>>, rid: ResourceId, -) -> Result<NextEventResponse, AnyError> { + kind_out: &mut [u32], +) -> Result<Option<StringOrBuffer>, AnyError> { let resource = state .borrow_mut() .resource_table @@ -567,28 +580,45 @@ pub async fn op_ws_next_event( let cancel = RcRef::map(&resource, |r| &r.cancel); let val = resource.next_message(cancel).await?; - let res = match val { - Some(Ok(Message::Text(text))) => NextEventResponse::String(text), - Some(Ok(Message::Binary(data))) => NextEventResponse::Binary(data.into()), - Some(Ok(Message::Close(Some(frame)))) => NextEventResponse::Close { - code: frame.code.into(), - reason: frame.reason.to_string(), - }, - Some(Ok(Message::Close(None))) => NextEventResponse::Close { - code: 1005, - reason: String::new(), - }, - Some(Ok(Message::Ping(_))) => NextEventResponse::Ping, - Some(Ok(Message::Pong(_))) => NextEventResponse::Pong, - Some(Err(e)) => NextEventResponse::Error(e.to_string()), + let (kind, value) = match val { + Some(Ok(Message::Text(text))) => ( + NextEventKind::String as u32, + Some(StringOrBuffer::String(text)), + ), + Some(Ok(Message::Binary(data))) => ( + NextEventKind::Binary as u32, + Some(StringOrBuffer::Buffer(data.into())), + ), + Some(Ok(Message::Close(Some(frame)))) => { + let code: u16 = frame.code.into(); + kind_out[1] = code as u32; + ( + NextEventKind::Close as u32, + Some(StringOrBuffer::String(frame.reason.to_string())), + ) + } + Some(Ok(Message::Close(None))) => { + kind_out[1] = 1005; + ( + NextEventKind::Close as u32, + Some(StringOrBuffer::String(String::new())), + ) + } + Some(Ok(Message::Ping(_))) => (NextEventKind::Ping as u32, None), + Some(Ok(Message::Pong(_))) => (NextEventKind::Pong as u32, None), + Some(Err(e)) => ( + NextEventKind::Error as u32, + Some(StringOrBuffer::String(e.to_string())), + ), None => { // No message was received, presumably the socket closed while we waited. // Try close the stream, ignoring any errors, and report closed status to JavaScript. let _ = state.borrow_mut().resource_table.close(rid); - NextEventResponse::Closed + (NextEventKind::Closed as u32, None) } }; - Ok(res) + kind_out[0] = kind as u32; + Ok(value) } pub fn init<P: WebSocketPermissions + 'static>( |