diff options
author | Leo Kettmeir <crowlkats@toaxl.com> | 2023-02-11 15:14:02 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-11 14:14:02 +0000 |
commit | a55f0eb2fc005016dc9d44bfe4771dd451df9c30 (patch) | |
tree | 7d2a2ea9f6271a18e6d4f12309e3fa244e979bfa /ext/net/ops.rs | |
parent | e22ebc6b6bb733a111ba02781e53e186f9c8bcc8 (diff) |
feat: add signal option to Deno.resolveDns (#17384)
Closes #14406
Diffstat (limited to 'ext/net/ops.rs')
-rw-r--r-- | ext/net/ops.rs | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/ext/net/ops.rs b/ext/net/ops.rs index 1d84a1067..737a46d8c 100644 --- a/ext/net/ops.rs +++ b/ext/net/ops.rs @@ -9,6 +9,7 @@ use deno_core::error::custom_error; use deno_core::error::generic_error; use deno_core::error::AnyError; use deno_core::op; +use deno_core::CancelFuture; use deno_core::AsyncRefCell; use deno_core::ByteString; @@ -416,6 +417,7 @@ pub enum DnsReturnRecord { #[derive(Deserialize)] #[serde(rename_all = "camelCase")] pub struct ResolveAddrArgs { + cancel_rid: Option<ResourceId>, query: String, record_type: RecordType, options: Option<ResolveDnsOption>, @@ -451,6 +453,7 @@ where query, record_type, options, + cancel_rid, } = args; let (config, opts) = if let Some(name_server) = @@ -484,9 +487,29 @@ where let resolver = AsyncResolver::tokio(config, opts)?; - resolver - .lookup(query, record_type) - .await + let lookup_fut = resolver.lookup(query, record_type); + + let cancel_handle = cancel_rid.and_then(|rid| { + state + .borrow_mut() + .resource_table + .get::<CancelHandle>(rid) + .ok() + }); + + let lookup = if let Some(cancel_handle) = cancel_handle { + let lookup_rv = lookup_fut.or_cancel(cancel_handle).await; + + if let Some(cancel_rid) = cancel_rid { + state.borrow_mut().resource_table.close(cancel_rid).ok(); + }; + + lookup_rv? + } else { + lookup_fut.await + }; + + lookup .map_err(|e| { let message = format!("{e}"); match e.kind() { |