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