summaryrefslogtreecommitdiff
path: root/ext/websocket/lib.rs
diff options
context:
space:
mode:
authorDivy Srivastava <dj.srivastava23@gmail.com>2023-05-18 20:16:19 +0530
committerGitHub <noreply@github.com>2023-05-18 20:16:19 +0530
commit6241a657ae9b63d4e529853b19e6666e5fa7f653 (patch)
treeb19289501fcf05601c738bfce3337885066f782a /ext/websocket/lib.rs
parent26a64b4edda3c74e26ebec1d1f6af3ffa155012d (diff)
fix(ext/websocket): order of ws writes (#19131)
Fixes https://github.com/denoland/deno/issues/19041
Diffstat (limited to 'ext/websocket/lib.rs')
-rw-r--r--ext/websocket/lib.rs4
1 files changed, 4 insertions, 0 deletions
diff --git a/ext/websocket/lib.rs b/ext/websocket/lib.rs
index ccda33cfc..f2101b413 100644
--- a/ext/websocket/lib.rs
+++ b/ext/websocket/lib.rs
@@ -283,6 +283,7 @@ where
let resource = ServerWebSocket {
ws: AsyncRefCell::new(FragmentCollector::new(stream)),
closed: Rc::new(Cell::new(false)),
+ tx_lock: AsyncRefCell::new(()),
};
let mut state = state.borrow_mut();
let rid = state.resource_table.add(resource);
@@ -316,6 +317,7 @@ pub enum MessageKind {
pub struct ServerWebSocket {
ws: AsyncRefCell<FragmentCollector<WebSocketStream>>,
closed: Rc<Cell<bool>>,
+ tx_lock: AsyncRefCell<()>,
}
impl ServerWebSocket {
@@ -324,6 +326,7 @@ impl ServerWebSocket {
self: Rc<Self>,
frame: Frame,
) -> Result<(), AnyError> {
+ let _lock = RcRef::map(&self, |r| &r.tx_lock).borrow_mut().await;
// SAFETY: fastwebsockets only needs a mutable reference to the WebSocket
// to populate the write buffer. We encounter an await point when writing
// to the socket after the frame has already been written to the buffer.
@@ -360,6 +363,7 @@ pub fn ws_create_server_stream(
let ws_resource = ServerWebSocket {
ws: AsyncRefCell::new(FragmentCollector::new(ws)),
closed: Rc::new(Cell::new(false)),
+ tx_lock: AsyncRefCell::new(()),
};
let rid = state.resource_table.add(ws_resource);