diff options
Diffstat (limited to 'extensions/web')
-rw-r--r-- | extensions/web/lib.rs | 2 | ||||
-rw-r--r-- | extensions/web/message_port.rs | 19 |
2 files changed, 16 insertions, 5 deletions
diff --git a/extensions/web/lib.rs b/extensions/web/lib.rs index d74bb619d..6e3552476 100644 --- a/extensions/web/lib.rs +++ b/extensions/web/lib.rs @@ -2,7 +2,9 @@ mod message_port; +pub use crate::message_port::create_entangled_message_port; pub use crate::message_port::JsMessageData; +pub use crate::message_port::MessagePort; use deno_core::error::bad_resource_id; use deno_core::error::null_opbuf; diff --git a/extensions/web/message_port.rs b/extensions/web/message_port.rs index d10b455d5..f73d0486a 100644 --- a/extensions/web/message_port.rs +++ b/extensions/web/message_port.rs @@ -23,7 +23,7 @@ type MessagePortMessage = (Vec<u8>, Vec<Transferable>); pub struct MessagePort { rx: RefCell<UnboundedReceiver<MessagePortMessage>>, - tx: UnboundedSender<MessagePortMessage>, + tx: RefCell<Option<UnboundedSender<MessagePortMessage>>>, } impl MessagePort { @@ -37,7 +37,9 @@ impl MessagePort { // Swallow the failed to send error. It means the channel was disentangled, // but not cleaned up. - self.tx.send((data.data.to_vec(), transferables)).ok(); + if let Some(tx) = &*self.tx.borrow() { + tx.send((data.data.to_vec(), transferables)).ok(); + } Ok(()) } @@ -60,6 +62,13 @@ impl MessagePort { } Ok(None) } + + /// This forcefully disconnects the message port from its paired port. This + /// will wake up the `.recv` on the paired port, which will return `Ok(None)`. + pub fn disentangle(&self) { + let mut tx = self.tx.borrow_mut(); + tx.take(); + } } pub fn create_entangled_message_port() -> (MessagePort, MessagePort) { @@ -68,12 +77,12 @@ pub fn create_entangled_message_port() -> (MessagePort, MessagePort) { let port1 = MessagePort { rx: RefCell::new(port1_rx), - tx: port1_tx, + tx: RefCell::new(Some(port1_tx)), }; let port2 = MessagePort { rx: RefCell::new(port2_rx), - tx: port2_tx, + tx: RefCell::new(Some(port2_tx)), }; (port1, port2) @@ -204,5 +213,5 @@ pub async fn op_message_port_recv_message( } }; let cancel = RcRef::map(resource.clone(), |r| &r.cancel); - resource.port.recv(state.clone()).or_cancel(cancel).await? + resource.port.recv(state).or_cancel(cancel).await? } |