From e1fb174f86adce421ee6bbce70e5dc1558c10868 Mon Sep 17 00:00:00 2001 From: Divy Srivastava Date: Sat, 9 Mar 2024 09:36:17 +0530 Subject: [PATCH] fix(ext/websocket): do not continue reading if socket rid closes (#21849) Fixes https://github.com/denoland/deno/issues/21379 --- ext/websocket/01_websocket.js | 14 ++++++++++++-- ext/websocket/lib.rs | 16 ++++++++++------ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/ext/websocket/01_websocket.js b/ext/websocket/01_websocket.js index 15793a886a..6c9bbc1575 100644 --- a/ext/websocket/01_websocket.js +++ b/ext/websocket/01_websocket.js @@ -417,9 +417,14 @@ class WebSocket extends EventTarget { switch (kind) { case 0: { /* string */ + const data = op_ws_get_buffer_as_string(rid); + if (data === undefined) { + break; + } + this[_serverHandleIdleTimeout](); const event = new MessageEvent("message", { - data: op_ws_get_buffer_as_string(rid), + data, origin: this[_url], }); setIsTrusted(event, true); @@ -428,9 +433,14 @@ class WebSocket extends EventTarget { } case 1: { /* binary */ + const d = op_ws_get_buffer(rid); + if (d == undefined) { + break; + } + this[_serverHandleIdleTimeout](); // deno-lint-ignore prefer-primordials - const buffer = op_ws_get_buffer(rid).buffer; + const buffer = d.buffer; let data; if (this.binaryType === "blob") { data = new Blob([buffer]); diff --git a/ext/websocket/lib.rs b/ext/websocket/lib.rs index e6f382c341..e4df9d3d35 100644 --- a/ext/websocket/lib.rs +++ b/ext/websocket/lib.rs @@ -703,9 +703,11 @@ pub async fn op_ws_close( pub fn op_ws_get_buffer( state: &mut OpState, #[smi] rid: ResourceId, -) -> Result { - let resource = state.resource_table.get::(rid)?; - Ok(resource.buffer.take().unwrap().into()) +) -> Option { + let Ok(resource) = state.resource_table.get::(rid) else { + return None; + }; + resource.buffer.take().map(ToJsBuffer::from) } #[op2] @@ -713,9 +715,11 @@ pub fn op_ws_get_buffer( pub fn op_ws_get_buffer_as_string( state: &mut OpState, #[smi] rid: ResourceId, -) -> Result { - let resource = state.resource_table.get::(rid)?; - Ok(resource.string.take().unwrap()) +) -> Option { + let Ok(resource) = state.resource_table.get::(rid) else { + return None; + }; + resource.string.take() } #[op2]