From a55f0eb2fc005016dc9d44bfe4771dd451df9c30 Mon Sep 17 00:00:00 2001 From: Leo Kettmeir Date: Sat, 11 Feb 2023 15:14:02 +0100 Subject: feat: add signal option to Deno.resolveDns (#17384) Closes #14406 --- ext/net/01_net.js | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) (limited to 'ext/net/01_net.js') diff --git a/ext/net/01_net.js b/ext/net/01_net.js index 7b427ef5e..c56f837b8 100644 --- a/ext/net/01_net.js +++ b/ext/net/01_net.js @@ -8,6 +8,7 @@ import { readableStreamForRidUnrefableUnref, writableStreamForRid, } from "internal:deno_web/06_streams.js"; +import * as abortSignal from "internal:deno_web/03_abort_signal.js"; const primordials = globalThis.__bootstrap.primordials; const { Error, @@ -30,8 +31,31 @@ function shutdown(rid) { return core.shutdown(rid); } -function resolveDns(query, recordType, options) { - return core.opAsync("op_dns_resolve", { query, recordType, options }); +async function resolveDns(query, recordType, options) { + let cancelRid; + let abortHandler; + if (options?.signal) { + options.signal.throwIfAborted(); + cancelRid = ops.op_cancel_handle(); + abortHandler = () => core.tryClose(cancelRid); + options.signal[abortSignal.add](abortHandler); + } + + try { + return await core.opAsync("op_dns_resolve", { + cancelRid, + query, + recordType, + options, + }); + } finally { + if (options?.signal) { + options.signal[abortSignal.remove](abortHandler); + + // always throw the abort error when aborted + options.signal.throwIfAborted(); + } + } } class Conn { -- cgit v1.2.3