File tree Expand file tree Collapse file tree 3 files changed +41
-1
lines changed Expand file tree Collapse file tree 3 files changed +41
-1
lines changed Original file line number Diff line number Diff line change @@ -372,6 +372,17 @@ added: v0.1.99
372372Close the underlying socket and stop listening for data on it. If a callback is
373373provided, it is added as a listener for the [ ` 'close' ` ] [ ] event.
374374
375+ ### ` socket[Symbol.asyncDispose]() `
376+
377+ <!-- YAML
378+ added: REPLACEME
379+ -->
380+
381+ > Stability: 1 - Experimental
382+
383+ Calls [ ` socket.close() ` ] [ ] and returns a promise that fulfills when the
384+ socket has closed.
385+
375386### ` socket.connect(port[, address][, callback]) `
376387
377388<!-- YAML
@@ -992,4 +1003,5 @@ and `udp6` sockets). The bound address and port can be retrieved using
9921003[ `socket.address().address` ] : #socketaddress
9931004[ `socket.address().port` ] : #socketaddress
9941005[ `socket.bind()` ] : #socketbindport-address-callback
1006+ [ `socket.close()` ] : #socketclosecallback
9951007[ byte length ] : buffer.md#static-method-bufferbytelengthstring-encoding
Original file line number Diff line number Diff line change @@ -30,6 +30,7 @@ const {
3030 ObjectDefineProperty,
3131 ObjectSetPrototypeOf,
3232 ReflectApply,
33+ SymbolAsyncDispose,
3334 SymbolDispose,
3435} = primordials ;
3536
@@ -59,7 +60,7 @@ const {
5960 validatePort,
6061} = require ( 'internal/validators' ) ;
6162const { Buffer } = require ( 'buffer' ) ;
62- const { deprecate, guessHandleType } = require ( 'internal/util' ) ;
63+ const { deprecate, guessHandleType, promisify } = require ( 'internal/util' ) ;
6364const { isArrayBufferView } = require ( 'internal/util/types' ) ;
6465const EventEmitter = require ( 'events' ) ;
6566const {
@@ -752,6 +753,13 @@ Socket.prototype.close = function(callback) {
752753 return this ;
753754} ;
754755
756+ Socket . prototype [ SymbolAsyncDispose ] = async function ( ) {
757+ if ( ! this [ kStateSymbol ] . handle ) {
758+ return ;
759+ }
760+ return FunctionPrototypeCall ( promisify ( this . close ) , this ) ;
761+ } ;
762+
755763
756764function socketCloseNT ( self ) {
757765 self . emit ( 'close' ) ;
Original file line number Diff line number Diff line change 1+ import * as common from '../common/index.mjs' ;
2+ import assert from 'node:assert' ;
3+ import dgram from 'node:dgram' ;
4+ import { describe , it } from 'node:test' ;
5+
6+ describe ( 'dgram.Socket[Symbol.asyncDispose]()' , ( ) => {
7+ it ( 'should close the socket' , async ( ) => {
8+ const server = dgram . createSocket ( { type : 'udp4' } ) ;
9+ server . on ( 'close' , common . mustCall ( ) ) ;
10+ await server [ Symbol . asyncDispose ] ( ) . then ( common . mustCall ( ) ) ;
11+
12+ assert . throws ( ( ) => server . address ( ) , { code : 'ERR_SOCKET_DGRAM_NOT_RUNNING' } ) ;
13+ } ) ;
14+
15+ it ( 'should resolve even if the socket is already closed' , async ( ) => {
16+ const server = dgram . createSocket ( { type : 'udp4' } ) ;
17+ await server [ Symbol . asyncDispose ] ( ) . then ( common . mustCall ( ) ) ;
18+ await server [ Symbol . asyncDispose ] ( ) . then ( common . mustCall ( ) , common . mustNotCall ( ) ) ;
19+ } ) ;
20+ } ) ;
You can’t perform that action at this time.
0 commit comments