diff --git a/lib/_http_server.js b/lib/_http_server.js index b728f73c419772..98aa53490946bd 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -29,7 +29,6 @@ const { ObjectSetPrototypeOf, ReflectApply, Symbol, - SymbolAsyncDispose, SymbolFor, } = primordials; @@ -82,7 +81,6 @@ const { const { assignFunctionName, kEmptyObject, - promisify, } = require('internal/util'); const { validateInteger, @@ -580,10 +578,6 @@ Server.prototype.close = function close() { return this; }; -Server.prototype[SymbolAsyncDispose] = assignFunctionName(SymbolAsyncDispose, async function() { - await promisify(this.close).call(this); -}); - Server.prototype.closeAllConnections = function closeAllConnections() { if (!this[kConnections]) { return; diff --git a/lib/https.js b/lib/https.js index acd3252b5cde66..e8cef0213d9876 100644 --- a/lib/https.js +++ b/lib/https.js @@ -33,13 +33,11 @@ const { ObjectSetPrototypeOf, ReflectApply, ReflectConstruct, - SymbolAsyncDispose, } = primordials; const { assertCrypto, kEmptyObject, - promisify, } = require('internal/util'); assertCrypto(); @@ -116,10 +114,6 @@ Server.prototype.close = function close() { return this; }; -Server.prototype[SymbolAsyncDispose] = async function() { - await FunctionPrototypeCall(promisify(this.close), this); -}; - /** * Creates a new `https.Server` instance. * @param {{ diff --git a/lib/internal/http2/core.js b/lib/internal/http2/core.js index 2ec1e9fc19a7e7..8fa5ccbf91870b 100644 --- a/lib/internal/http2/core.js +++ b/lib/internal/http2/core.js @@ -18,7 +18,6 @@ const { SafeMap, SafeSet, Symbol, - SymbolAsyncDispose, SymbolDispose, Uint32Array, Uint8Array, @@ -3346,10 +3345,6 @@ class Http2Server extends NETServer { ReflectApply(NETServer.prototype.close, this, arguments); closeAllSessions(this); } - - async [SymbolAsyncDispose]() { - await promisify(super.close).call(this); - } } Http2Server.prototype[EventEmitter.captureRejectionSymbol] = function( diff --git a/lib/net.js b/lib/net.js index a391e9da30f861..fa9f4d61d44622 100644 --- a/lib/net.js +++ b/lib/net.js @@ -118,6 +118,7 @@ const { const { isUint8Array } = require('internal/util/types'); const { queueMicrotask } = require('internal/process/task_queues'); const { + assignFunctionName, guessHandleType, isWindows, kEmptyObject, @@ -2391,12 +2392,12 @@ Server.prototype.close = function(cb) { return this; }; -Server.prototype[SymbolAsyncDispose] = async function() { +Server.prototype[SymbolAsyncDispose] = assignFunctionName(SymbolAsyncDispose, async function() { if (!this._handle) { return; } await FunctionPrototypeCall(promisify(this.close), this); -}; +}); Server.prototype._emitCloseIfDrained = function() { debug('SERVER _emitCloseIfDrained'); diff --git a/test/parallel/test-http-server-async-dispose.js b/test/parallel/test-http-server-async-dispose.js index 8af11dcb7b0c3c..7ede8d7107a8f1 100644 --- a/test/parallel/test-http-server-async-dispose.js +++ b/test/parallel/test-http-server-async-dispose.js @@ -7,8 +7,12 @@ const { kConnectionsCheckingInterval } = require('_http_server'); const server = createServer(); server.listen(0, common.mustCall(() => { + assert.strictEqual(server[Symbol.asyncDispose].name, '[Symbol.asyncDispose]'); server.on('close', common.mustCall()); server[Symbol.asyncDispose]().then(common.mustCall(() => { assert(server[kConnectionsCheckingInterval]._destroyed); + + // Disposer must be idempotent, subsequent call must not throw + server[Symbol.asyncDispose]().then(common.mustCall()); })); })); diff --git a/test/parallel/test-http2-server-async-dispose.js b/test/parallel/test-http2-server-async-dispose.js index 4782e12e417d27..90456513d09fd0 100644 --- a/test/parallel/test-http2-server-async-dispose.js +++ b/test/parallel/test-http2-server-async-dispose.js @@ -6,10 +6,17 @@ if (!common.hasCrypto) common.skip('missing crypto'); const http2 = require('http2'); +const assert = require('node:assert'); const server = http2.createServer(); server.listen(0, common.mustCall(() => { + assert.strictEqual(server[Symbol.asyncDispose].name, '[Symbol.asyncDispose]'); server.on('close', common.mustCall()); - server[Symbol.asyncDispose]().then(common.mustCall()); + server[Symbol.asyncDispose]().then(common.mustCall(() => { + assert.strictEqual(server._handle, null); + + // Disposer must be idempotent, subsequent call must not throw + server[Symbol.asyncDispose]().then(common.mustCall()); + })); })); diff --git a/test/parallel/test-https-server-async-dispose.js b/test/parallel/test-https-server-async-dispose.js index 93b5cb74bbda11..6a88fde838e980 100644 --- a/test/parallel/test-https-server-async-dispose.js +++ b/test/parallel/test-https-server-async-dispose.js @@ -12,8 +12,12 @@ const { kConnectionsCheckingInterval } = require('_http_server'); const server = createServer(); server.listen(0, common.mustCall(() => { + assert.strictEqual(server[Symbol.asyncDispose].name, '[Symbol.asyncDispose]'); server.on('close', common.mustCall()); server[Symbol.asyncDispose]().then(common.mustCall(() => { assert(server[kConnectionsCheckingInterval]._destroyed); + + // Disposer must be idempotent, subsequent call must not throw + server[Symbol.asyncDispose]().then(common.mustCall()); })); }));