summaryrefslogtreecommitdiff
path: root/ext/net/io.rs
diff options
context:
space:
mode:
authorYosi Pramajaya <yosi.pramajaya@gmail.com>2022-01-31 22:36:54 +0700
committerGitHub <noreply@github.com>2022-01-31 16:36:54 +0100
commit3e566bb457663cec57602e564f73ded817e426a8 (patch)
tree7644ed068287f35060cf1a0c7c1827c629778df9 /ext/net/io.rs
parentb7b6b9c9e5b84dea67ff6a2b691245f640644b2c (diff)
feat(ext/net): Add Conn.setNoDelay and Conn.setKeepAlive (#13103)
Diffstat (limited to 'ext/net/io.rs')
-rw-r--r--ext/net/io.rs30
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>;