File tree 3 files changed +41
-1
lines changed
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
372
372
Close the underlying socket and stop listening for data on it. If a callback is
373
373
provided, it is added as a listener for the [ ` 'close' ` ] [ ] event.
374
374
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
+
375
386
### ` socket.connect(port[, address][, callback]) `
376
387
377
388
<!-- YAML
@@ -988,4 +999,5 @@ and `udp6` sockets). The bound address and port can be retrieved using
988
999
[ `socket.address().address` ] : #socketaddress
989
1000
[ `socket.address().port` ] : #socketaddress
990
1001
[ `socket.bind()` ] : #socketbindport-address-callback
1002
+ [ `socket.close()` ] : #socketclosecallback
991
1003
[ byte length ] : buffer.md#static-method-bufferbytelengthstring-encoding
Original file line number Diff line number Diff line change @@ -30,6 +30,7 @@ const {
30
30
ObjectDefineProperty,
31
31
ObjectSetPrototypeOf,
32
32
ReflectApply,
33
+ SymbolAsyncDispose,
33
34
SymbolDispose,
34
35
} = primordials ;
35
36
@@ -60,7 +61,7 @@ const {
60
61
validatePort,
61
62
} = require ( 'internal/validators' ) ;
62
63
const { Buffer } = require ( 'buffer' ) ;
63
- const { deprecate } = require ( 'internal/util' ) ;
64
+ const { deprecate, promisify } = require ( 'internal/util' ) ;
64
65
const { isArrayBufferView } = require ( 'internal/util/types' ) ;
65
66
const EventEmitter = require ( 'events' ) ;
66
67
const {
@@ -753,6 +754,13 @@ Socket.prototype.close = function(callback) {
753
754
return this ;
754
755
} ;
755
756
757
+ Socket . prototype [ SymbolAsyncDispose ] = async function ( ) {
758
+ if ( ! this [ kStateSymbol ] . handle ) {
759
+ return ;
760
+ }
761
+ return FunctionPrototypeCall ( promisify ( this . close ) , this ) ;
762
+ } ;
763
+
756
764
757
765
function socketCloseNT ( self ) {
758
766
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