From 6a78fc735e956054fc4657e39892874f99ea0c94 Mon Sep 17 00:00:00 2001
From: Anna Henningsen <anna@addaleax.net>
Date: Thu, 13 Aug 2020 20:59:51 +0200
Subject: [PATCH 1/2] quic: use AbortController with correct name/message

On the web, `AbortError` is the error name, not the error
message. Change the code to match that.
---
 lib/internal/quic/core.js | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/lib/internal/quic/core.js b/lib/internal/quic/core.js
index 11515ebf5fa476..037718b896e35c 100644
--- a/lib/internal/quic/core.js
+++ b/lib/internal/quic/core.js
@@ -253,10 +253,10 @@ let warnedVerifyHostnameIdentity = false;
 
 let DOMException;
 
-const lazyDOMException = hideStackFrames((message) => {
+const lazyDOMException = hideStackFrames((message, name) => {
   if (DOMException === undefined)
     DOMException = internalBinding('messaging').DOMException;
-  return new DOMException(message);
+  return new DOMException(message, name);
 });
 
 assert(process.versions.ngtcp2 !== undefined);
@@ -664,10 +664,10 @@ class QuicEndpoint {
     if (signal != null && !('aborted' in signal))
       throw new ERR_INVALID_ARG_TYPE('options.signal', 'AbortSignal', signal);
 
-    // If an AbotSignal was passed in, check to make sure it is not already
+    // If an AbortSignal was passed in, check to make sure it is not already
     // aborted before we continue on to do any work.
     if (signal && signal.aborted)
-      throw new lazyDOMException('AbortError');
+      throw new lazyDOMException('The operation was aborted', 'AbortError');
 
     state.state = kSocketPending;
 
@@ -685,7 +685,7 @@ class QuicEndpoint {
     // while we were waiting.
     if (signal && signal.aborted) {
       state.state = kSocketUnbound;
-      throw new lazyDOMException('AbortError');
+      throw new lazyDOMException('The operation was aborted', 'AbortError');
     }
 
     // From here on, any errors are fatal for the QuicEndpoint. Keep in
@@ -1064,7 +1064,7 @@ class QuicSocket extends EventEmitter {
     // If an AbotSignal was passed in, check to make sure it is not already
     // aborted before we continue on to do any work.
     if (signal && signal.aborted)
-      throw new lazyDOMException('AbortError');
+      throw new lazyDOMException('The operation was aborted', 'AbortError');
 
     state.state = kSocketPending;
 
@@ -1086,7 +1086,7 @@ class QuicSocket extends EventEmitter {
       // Some number of endpoints may have successfully bound, while
       // others have not
       if (signal && signal.aborted)
-        throw lazyDOMException('AbortError');
+        throw lazyDOMException('The operation was aborted', 'AbortError');
 
       state.state = kSocketBound;
 

From a515a3176c00047bb73afb8830134876670ac9c1 Mon Sep 17 00:00:00 2001
From: Anna Henningsen <anna@addaleax.net>
Date: Thu, 13 Aug 2020 21:00:55 +0200
Subject: [PATCH 2/2] timers: use AbortController with correct name/message

On the web, `AbortError` is the error name, not the error
message. Change the code to match that.
---
 lib/timers/promises.js | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/lib/timers/promises.js b/lib/timers/promises.js
index 78197fe86f6e22..ef1e6437d4f6ca 100644
--- a/lib/timers/promises.js
+++ b/lib/timers/promises.js
@@ -18,10 +18,10 @@ const {
 
 let DOMException;
 
-const lazyDOMException = hideStackFrames((message) => {
+const lazyDOMException = hideStackFrames((message, name) => {
   if (DOMException === undefined)
     DOMException = internalBinding('messaging').DOMException;
-  return new DOMException(message);
+  return new DOMException(message, name);
 });
 
 function setTimeout(after, value, options = {}) {
@@ -54,8 +54,10 @@ function setTimeout(after, value, options = {}) {
   // TODO(@jasnell): If a decision is made that this cannot be backported
   // to 12.x, then this can be converted to use optional chaining to
   // simplify the check.
-  if (signal && signal.aborted)
-    return PromiseReject(lazyDOMException('AbortError'));
+  if (signal && signal.aborted) {
+    return PromiseReject(
+      lazyDOMException('The operation was aborted', 'AbortError'));
+  }
   return new Promise((resolve, reject) => {
     const timeout = new Timeout(resolve, after, args, false, true);
     if (!ref) timeout.unref();
@@ -65,7 +67,7 @@ function setTimeout(after, value, options = {}) {
         if (!timeout._destroyed) {
           // eslint-disable-next-line no-undef
           clearTimeout(timeout);
-          reject(lazyDOMException('AbortError'));
+          reject(lazyDOMException('The operation was aborted', 'AbortError'));
         }
       }, { once: true });
     }
@@ -101,8 +103,10 @@ function setImmediate(value, options = {}) {
   // TODO(@jasnell): If a decision is made that this cannot be backported
   // to 12.x, then this can be converted to use optional chaining to
   // simplify the check.
-  if (signal && signal.aborted)
-    return PromiseReject(lazyDOMException('AbortError'));
+  if (signal && signal.aborted) {
+    return PromiseReject(
+      lazyDOMException('The operation was aborted', 'AbortError'));
+  }
   return new Promise((resolve, reject) => {
     const immediate = new Immediate(resolve, [value]);
     if (!ref) immediate.unref();
@@ -111,7 +115,7 @@ function setImmediate(value, options = {}) {
         if (!immediate._destroyed) {
           // eslint-disable-next-line no-undef
           clearImmediate(immediate);
-          reject(lazyDOMException('AbortError'));
+          reject(lazyDOMException('The operation was aborted', 'AbortError'));
         }
       }, { once: true });
     }