diff options
author | Yosi Pramajaya <yosi.pramajaya@gmail.com> | 2022-01-31 22:36:54 +0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-31 16:36:54 +0100 |
commit | 3e566bb457663cec57602e564f73ded817e426a8 (patch) | |
tree | 7644ed068287f35060cf1a0c7c1827c629778df9 /ext/net/io.rs | |
parent | b7b6b9c9e5b84dea67ff6a2b691245f640644b2c (diff) |
feat(ext/net): Add Conn.setNoDelay and Conn.setKeepAlive (#13103)
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>; |