diff options
author | Divy Srivastava <dj.srivastava23@gmail.com> | 2023-05-18 20:16:19 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-18 20:16:19 +0530 |
commit | 6241a657ae9b63d4e529853b19e6666e5fa7f653 (patch) | |
tree | b19289501fcf05601c738bfce3337885066f782a /ext/websocket/lib.rs | |
parent | 26a64b4edda3c74e26ebec1d1f6af3ffa155012d (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.rs | 4 |
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); |