diff options
Diffstat (limited to 'ext/net/io.rs')
-rw-r--r-- | ext/net/io.rs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/ext/net/io.rs b/ext/net/io.rs index 9673a4a89..17b86af17 100644 --- a/ext/net/io.rs +++ b/ext/net/io.rs @@ -1,5 +1,6 @@ // Copyright 2018-2022 the Deno authors. All rights reserved. MIT license. +use deno_core::error::generic_error; use deno_core::error::AnyError; use deno_core::AsyncMutFuture; use deno_core::AsyncRefCell; @@ -9,6 +10,7 @@ use deno_core::CancelTryFuture; use deno_core::RcRef; use deno_core::Resource; use deno_core::ZeroCopyBuf; +use socket2::SockRef; use std::borrow::Cow; use std::rc::Rc; use tokio::io::AsyncRead; @@ -118,6 +120,34 @@ impl Resource for TcpStreamResource { } } +impl TcpStreamResource { + pub fn set_nodelay(self: Rc<Self>, nodelay: bool) -> Result<(), AnyError> { + self.map_socket(Box::new(move |socket| Ok(socket.set_nodelay(nodelay)?))) + } + + pub fn set_keepalive( + self: Rc<Self>, + keepalive: bool, + ) -> Result<(), AnyError> { + self + .map_socket(Box::new(move |socket| Ok(socket.set_keepalive(keepalive)?))) + } + + fn map_socket( + self: Rc<Self>, + map: Box<dyn FnOnce(SockRef) -> Result<(), AnyError>>, + ) -> Result<(), AnyError> { + if let Some(wr) = RcRef::map(self, |r| &r.wr).try_borrow() { + let stream = wr.as_ref().as_ref(); + let socket = socket2::SockRef::from(stream); + + return map(socket); + } + + Err(generic_error("Unable to get resources")) + } +} + #[cfg(unix)] pub type UnixStreamResource = FullDuplexResource<unix::OwnedReadHalf, unix::OwnedWriteHalf>; |